はじめに
@pikさんの記事[Delphi][小ネタ]しかのこのこのここしたんたんのmatlab
版である.
回答1
s='しかのこたん';for n=1:10 disp(s([1:4,3,4,3,4,4,1,5,6,5,6]));end
解説
s='しかのこたん';
文字列の宣言だ.s(1)
が'し'
であり,s(3:4)
で'のこ'
となる.[]
で囲んでs([1:4,3,4,3,4,4,1,5,6,5,6]
とすることで,'しかのこのこのここしたんたん'
となる.
こいつをfor
文で10回回してフィニッシュである.
回答2
s='しかのこたん';disp(repmat(s([1:4,3,4,3,4,4,1,5,6,5,6]),10,1))
次に思いついたのがこれ.
解説
repmat(hoge,10,1)
これで配列hoge
を縦に10個コピーする.
TL;DR
これ以降は色々頑張ったけどむしろコード量が増えてしまって完全敗北したものである.
せっかくなので書いておくけど,まぁ蛇足である.
考え方
s='しかのこたん';
A=[ 1 0 0 0 0 0 0 0 0 1 0 0 0 0;
0 1 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 1 0 1 0 1 0 0 0 0 0 0 0;
0 0 0 1 0 1 0 1 1 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 1 0 1 0;
0 0 0 0 0 0 0 0 0 0 0 1 0 1];
disp(char(ones(10,1)*s*A))
ちょっとmatlab
っぽい書き方が無いかなぁと思ってやってみたのがこれ.
A=\begin{pmatrix}
1&0&0&0&0&0&0&0&0&1&0&0&0&0\\
0&1&0&0&0&0&0&0&0&0&0&0&0&0\\
0&0&1&0&1&0&1&0&0&0&0&0&0&0\\
0&0&0&1&0&1&0&1&1&0&0&0&0&0\\
0&0&0&0&0&0&0&0&0&0&1&0&1&0\\
0&0&0&0&0&0&0&0&0&0&0&1&0&1\\
\end{pmatrix}
\begin{pmatrix}
しかのこたん
\end{pmatrix}
A
=
\begin{pmatrix}
しかのこのこのここしたんたん
\end{pmatrix}
\begin{pmatrix}
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
\end{pmatrix}
\begin{pmatrix}
しかのこのこのここしたんたん
\end{pmatrix}
=
\begin{pmatrix}
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
\end{pmatrix}
disp(char(hoge))
文字列s
にones(10,1)
などをかけると全体が数値データとして認識され,これをdisp
に入れると数値が表示されてしまうため,char()
でキャストして文字列にしてあげる.
この考え方をベースとして,コード量を減らしていく.
bitget
bitget
を使ってみる.bitget
は3
などの数値を[0 0 0 0 0 0 1 1]
のような2進数の配列に変換する関数である.
A_2=\begin{pmatrix}
1&0&0&0&0&0&0&0&0&1&0& \cdots & 0&1&0&1
\end{pmatrix}
行列A
を横ベクトルA2
に変換して,bitget(n)=A2
となるような数値n
を求めて,A2
を再度(6×14)
の行列に直せば行けるだろう.
b= 100000000100000\cdots 101
として,b
を求めようと思ったが,b
は84桁あり,matlab
は64bit
までしか対応していないのでこのままでは実装出来ない.
A=\begin{pmatrix}
1&0&0&0\\
0&1&0&0\\
0&0&1&0\\
0&0&0&1\\
0&0&0&0\\
0&0&0&0\\
\end{pmatrix}
,
\begin{pmatrix}
0&0&0&0&0&1&0&0&0&0\\
0&0&0&0&0&0&0&0&0&0\\
1&0&1&0&0&0&0&0&0&0\\
0&1&0&1&1&0&0&0&0&0\\
0&0&0&0&0&0&1&0&1&0\\
0&0&0&0&0&0&0&1&0&1\\
\end{pmatrix}
として右側・左側に分離すると,左側は単位行列っぽいやつになる.これはeye
で作り出せる.
eye(6,4)
残った右側は60bit
であり,matlab
で扱える桁数となった.実装した結果が以下である.
s='しかのこたん';
disp(char(ones(10,1)*s*[eye(6,4),reshape(double(bitget(0x810810048204204,1:60)),6,[])]))
解説
[eye(6,4),reshape(double(bitget(0x810810048204204,1:60)),6,[])]
これがA
である.
bitget(0x810810048204204,1:60)),6,[])
の時点では型がuint64
であり,s
との乗算が出来ないため,double
でキャストしている.
終わり
matlab
なーんも分からんくて泣いちゃった.
つよつよmatlab
エンジニャーにもっと凄いコードを書いていただきたく.