[MATLAB][小ネタ]しかのこのこのここしたんたん

# はじめに
@pikさんの記事[[Delphi][小ネタ]しかのこのこのここしたんたん](https://qiita.com/pik/items/0a71530a622664afa4b9)の`matlab`版である．

https://x.com/Awed_Urshy/status/1821112609799913615?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1821112609799913615%7Ctwgr%5Eedfe7aac041392567d869e7c35e78d11cc83d473%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fqiita.com%2Fpik%2Fitems%2F0a71530a622664afa4b9

# 回答1
```matlab:shika1.mat
s='しかのこたん';for n=1:10 disp(s([1:4,3,4,3,4,4,1,5,6,5,6]));end
```
## 解説
```matlab:
s='しかのこたん';
```
文字列の宣言だ．`s(1)`が`'し'`であり，`s(3:4)`で`'のこ'`となる．`[]`で囲んで`s([1:4,3,4,3,4,4,1,5,6,5,6]`とすることで，`'しかのこのこのここしたんたん'`となる．
こいつを`for`文で10回回してフィニッシュである．

# 回答2
```matlab:shika2.mat
s='しかのこたん';disp(repmat(s([1:4,3,4,3,4,4,1,5,6,5,6]),10,1))
```
次に思いついたのがこれ．

## 解説

```matlab:
repmat(hoge,10,1)
```
これで配列`hoge`を縦に10個コピーする．



# TL;DR
これ以降は色々頑張ったけどむしろコード量が増えてしまって完全敗北したものである．
せっかくなので書いておくけど，まぁ蛇足である．



## 考え方

```matlab:shika_test.mat
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`っぽい書き方が無いかなぁと思ってやってみたのがこれ．

```math
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}
```
```math
\begin{pmatrix}
しかのこたん
\end{pmatrix}
A
=
\begin{pmatrix}
しかのこのこのここしたんたん
\end{pmatrix}
```
```math
\begin{pmatrix}
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
1\\
\end{pmatrix}

\begin{pmatrix}
しかのこのこのここしたんたん
\end{pmatrix}
=
\begin{pmatrix}
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
しかのこのこのここしたんたん\\
\end{pmatrix}
```


```matlab:
 disp(char(hoge))
```
文字列`s`に`ones(10,1)`などをかけると全体が数値データとして認識され，これを`disp`に入れると数値が表示されてしまうため，`char()`でキャストして文字列にしてあげる．


この考え方をベースとして，コード量を減らしていく．

## bitget
`bitget`を使ってみる．`bitget`は`3`などの数値を`[0 0 0 0 0 0 1 1]`のような2進数の配列に変換する関数である．
```math
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)`の行列に直せば行けるだろう．

```math
b= 100000000100000\cdots 101
```
として，`b`を求めようと思ったが，`b`は84桁あり，`matlab`は`64bit`までしか対応していないのでこのままでは実装出来ない．

```math
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`で作り出せる．
```matlab:
eye(6,4)
```
残った右側は`60bit`であり，`matlab`で扱える桁数となった．実装した結果が以下である．

```matlab:shika3.mat
s='しかのこたん';
disp(char(ones(10,1)*s*[eye(6,4),reshape(double(bitget(0x810810048204204,1:60)),6,[])]))
```

## 解説
```matlab:
[eye(6,4),reshape(double(bitget(0x810810048204204,1:60)),6,[])]
```
これが`A`である．

`bitget(0x810810048204204,1:60)),6,[])`の時点では型が`uint64`であり，`s`との乗算が出来ないため，`double`でキャストしている．


# 終わり
`matlab`なーんも分からんくて泣いちゃった．

つよつよ`matlab`エンジニャーにもっと凄いコードを書いていただきたく．