3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-10-07

はじめに

@pikさんの記事[Delphi][小ネタ]しかのこのこのここしたんたんmatlab版である.

回答1

shika1.mat
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

shika2.mat
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

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

考え方

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

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))

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

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

bitget

bitgetを使ってみる.bitget3などの数値を[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桁あり,matlab64bitまでしか対応していないのでこのままでは実装出来ない.

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で扱える桁数となった.実装した結果が以下である.

shika3.mat
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エンジニャーにもっと凄いコードを書いていただきたく.

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?