【FFT】MATLAB、Pythonで株価予測 その29【IFFT⑧】

【FFT】MATLAB、Pythonで株価予測 その29【IFFT⑧】 株価予測
【FFT】MATLAB、Pythonで株価予測 その29【IFFT⑧】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/

はじめに

前回からIFFTに活躍してもらうべく超簡易的なバンドパスフィルタにチャレンジ。
その前に周波数分布関数のローテーションを行う。
FFTで得られる周波数分布関数の後半にいる複素共役を負の周波数帯に持ってきた方が扱いやすい。

まずはMATLABでローテーションを実施する。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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

MATLABのベクトルローテーション関数

太郎くん
太郎くん

で、今回は周波数分布関数をローテーションさせて、複素共役を負の周波数帯には位置するって事になると思うのだけど、
MATLABでベクトルのローテーションとかできるんだっけ?
最悪はfor文で回せば良いとは思うけど。

フクさん
フクさん

あるよ。
circshiftって関数。

フクさん
フクさん

ベクトルだけでなく、行列でも使用可能で、
ローテーションさせる次元の指示もできるようだ。
まぁここにちょっと罠がわるわけなのだけど。

circshiftの罠

太郎くん
太郎くん

関数があるならそれ使っちゃえばOKだね。
簡単に実験してみよう。

>> A = [1, 2, 3, 4, 5]

A =

     1     2     3     4     5

>> B=circshift(A,3)

B =

     1     2     3     4     5

>> 
太郎くん
太郎くん

あ、あれ?
ローテーションどころかシフトもしてない・・・。

フクさん
フクさん

だから罠があるっていったじゃん。

太郎くん
太郎くん

何?
なんかよくわからん仕様があるのか?!

フクさん
フクさん

circshiftはデフォルトの次元が1で、
つまり列方向のローテーションになるんだよね。
そして、太郎くんが作成したベクトルは行ベクトル
列がローテーションされただけで、行には影響しなかったってことだ。

circshiftのローテーションルール

太郎くん
太郎くん

で、結局どうすれば良いの?

フクさん
フクさん

まぁ最初から列ベクトルにしておくってのが手っ取り早いかな。

>> A = [1, 2, 3, 4, 5]'

A =

     1
     2
     3
     4
     5

>> Y = circshift(A,3)

Y =

     3
     4
     5
     1
     2
太郎くん
太郎くん

これだと行ベクトルにはできないってことになっちゃうけど・・・。

フクさん
フクさん

行ベクトルに対してやるならこんな感じになるな。

>> A = [1, 2, 3, 4, 5]

A =

     1     2     3     4     5

>> Y = circshift(A,[0,3])

Y =

     3     4     5     1     2
太郎くん
太郎くん

なんか、引数にベクトルが・・・。

フクさん
フクさん

[0,3]の内訳は、それぞれの次元のローテーションさせたい数だな。
[0,3]の場合だと、
列方向に0、行方向に3。
ってことになる。

太郎くん
太郎くん

あー、そういう使い方になるのか。
なんとなくわかった。

フクさん
フクさん

(まさか、circshiftだけで1回分になるとは・・・。)

まとめ

フクさん
フクさん

まとめだよ

  • MATLABでベクトルローテーションをさせたい場合はcircshift関数を使えばOK。
    • ただし、次元指定の罠がある。
      • デフォルト次元が列方向なので、行ベクトルに対して行うとローテーションされない。
      • (実際には列方向にローテーションはされてると思う)
      • [0,3]のように列行それぞれにローテーション数を指定する。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました