バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回は、元の数式を確認後、MATLABによるフーリエ変換、逆フーリエ変換をfor文無しの行列演算を書いてみた。
予想通りではあるが、1発の演算になる。
for文版、行列版のどちらを採用しても良いが、本シリーズに於いてはfor文版をベースとする。
そして、前回のコードでちょっと気になる点が出てくる・・・。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
前回のコードで気になる点
ちょっと前回のコードで気になる点があるんだけど?
気になる点?
どこの話?
ちょっと、元の数式と前回のコードを再掲するね。
\(
\displaystyle \left[\begin{array}{c} F\left(x_{-N/2}\right) \\ \vdots \\ F\left(x_{N/2}\right) \end{array}\right]^{T}=\left[\begin{array}{c} f\left(x_{-N/2}\right) \\ \vdots \\ f\left(x_{N/2}\right) \end{array}\right]^{T}\left[\begin{array}{ccc} e^{-i \omega_{-N/2} t_{-N / 2} \pi} & \cdots & e^{-i \omega_{-N / 2} t_{N / 2} \pi} \\ \vdots & \ddots & \vdots \\ e^{-i \omega_{N / 2} t_{-N / 2} \pi} & \cdots & e^{-i \omega_{N / 2} t_{N / 2} \pi} \end{array}\right] \Delta t
\)
\(
\displaystyle \left[\begin{array}{c} f\left(x_{-N/2}\right) \\ \vdots \\ f\left(x_{N/2}\right) \end{array}\right]^{T}=\frac{1}{2 \pi}\left(\left[\begin{array}{c} F\left(\omega_{-N/2}\right) \\ \vdots \\ F\left(\omega_{N/2}\right) \end{array}\right]^{T}\left[\begin{array}{ccc} e^{i \omega_{-N/2} t_{-N / 2} \pi} & \cdots & e^{i \omega_{-N / 2} t_{N / 2} \pi} \\ \vdots & \ddots & \vdots \\ e^{i \omega_{N / 2} t_{-N / 2} \pi} & \cdots & e^{i \omega_{N / 2} t_{N / 2} \pi} \end{array}\right]\right) \Delta \omega
\)
% F(ω)=∫f(t)e^(-iωt)dt
Fw=ft*exp(-1j*w'*t)*dt;
% f(x)=(1/2π)∫F(ω)e^(iωt)dω
x=t;
fx=Fw*exp(1j*w'*x)*dw/(2*pi);
数式と一緒と言ってたけど、
よくよく見ると、どこがどう一緒なのかがわからんな・・・。
って思って。
なるほど。
確かにコード上では直接、行列を作ってるところは無いからな。
その疑問もうなづける。
臭いところとしては「w’t」と「w’x」だけど、
これらって行列じゃなくてベクトルだよね?
そして、それらの内積を計算してる?
臭いポイントとしてはあってる。
ただし、その部分の演算は内積ではないな。
列ベクトルと行ベクトルの直積を取って、元の数式上の行列を実現している。
直積?
普通、ベクトルの積は内積になるのだけど、
内積の前提条件は行ベクトル×列ベクトル。
今回やってるのは列ベクトル×行ベクトル。
って形でやってる。
何を言ってるのかわからん。
内積と直積
まぁ簡単な処理を見せた方が早そうだな。
>> A=1:9
A =
1 2 3 4 5 6 7 8 9
>> B=(1:9)'
B =
1
2
3
4
5
6
7
8
9
>> A*B
ans =
285
>> B*A
ans =
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
>>
!!
最初のA*Bは内積だけど、 次のB*Aが直積か!
確かに行列になってる!
まぁ例でも書いたように九九のようなことが出来る。
演算順序で性格が変わるとは・・・。
ベクトル、行列は交換法則が使えないことが多いからね。
入れ替えた際の処理の違いは注意が必要だ。
しかし、一発で九九の表が完成するのは面白いな。
でも、これってPython(Numpy)でも出来るものなのかな?
私もそこが気になっている。
まぁ実際に試してみるしかないな。
いきなりフーリエ変換、逆フーリエ変換のコードを書く前に
Numpyでも直積が効くかを確認した方が安全かも。
うーん、なんか罠があるパターンに見えるな・・・。
まとめ
まとめだよ。
- 前回のコード上で数式上の行列にあたる部分が見当たらない。
- 列ベクトルと行ベクトルによる直積を行って行列を生成している。
- 直積は九九の表をイメージすると分かり易いかも。
- Python(Numpy)で同様のことができるかは不明。
- よって、先に直積相当のことができる確認した方が吉。
バックナンバーはこちら。
コメント