ますはらの日記(?)

無線通信の勉強をしてる学生のぼやき(?)

Pythonで数値解析〜行列に関するものを触ってみた(続)〜

どうも。
今日は昨日に引き続き行列計算に関することをsympyを用いていろいろ試してみたことを書きたいと思います!

昨日は要素が実数のみで構成される行列を例にsympyを利用していたが、今回は要素を複素数(実数も含む)で構成される行列を例に扱えるかどうか検討してみました。

それでは早速…


Q. そもそも複素数を要素とする行列は定義できる?

Pythonではそもそも複素数を扱える(僕は勉強仕立てで普通に知らなかったのですが…笑)ので、当然使えるはず!
ってことで、次のようにして要素に複素数を含む行列の生成を試みました。

#python3
>>>from sympy import *
>>>M = Matrix([[2, 1+1j],[1-1j, 2]])
>>>M
[          2, 1.0 + 1.0*I],
[1.0 - 1.0*I,           2]])

ここでのjは元々Python複素数を扱うときに用いる虚数を表すもので、sympyでは虚数としてIを用いられるので表示したときにIに変わっているのはそのためだと思われます。

もちろん、Iを用いてでも同様に要素に複素数を含む行列を生成できます。

>>>M = Matrix([[2, 1+I],[1-I, 2]])
>>>M
Matrix([
[    2, 1 + I],
[1 - I,     2]])

これで簡単に解決しました( ´ ▽ ` )


Q. エルミート転置は使えるの?

これは昨日紹介した参考ページではエルミート転置ができるかどうかわからなかったので今回試してみようと思いました。しかし、どうすればできるのか?そもそも転置のやり方は?普通に転置の操作ができればできるだろう…と思ったので、まず転置のやり方を調べました。すると、転置は次のようにすると行えました。

>>>N= Matrix([[1, 2],[3, 1]])
>>>N.T
[1, 3],
[2, 1]])

転置は英語でTransposeでその頭文字Tを取ってるのでは…?そしたら、エルミート転置はHermitian Transposeと英語で表されるのでHとすれば使えるのでは…?思い立ったらすぐ実行!今までの例で使用した行列Mとは別の行列Lに対して行ってみました。

>>>L = Matrix([[1, 1+I],[2-I, 2]])
>>>L
Matrix([
[    1, 1 + I],
[2 - I,     2]])
>>>L.H
Matrix([
[    1, 2 + I],
[1 - I,     2]])
>>>L.T
Matrix([
[    1, 2 - I],
[1 + I,     2]])

以上から、エルミート転置させたい行列に.Hを付ける事でエルミート転置できる事がわかる。比較のために.Tで転置させたものも載せました。いやー、すごいですね〜。Pythonのライブラリの中身が充実している事が実感できます( ^ω^ )


これで複素数を含んだ行列も容易に扱える事がわかったので、無線通信(主にMIMOかな?)のシミュレーションに使える可能性がグッと高まりました!今後の目標としては確率など乱数生成などもPythonのライブラリを用いることで容易に行うことができるのか検証してみたいと思います。

もし、何かわかればブログに書きたいと思います。容易にシミュレーションのためのプログラムを作成することも現実味が出てきたので頑張ります( ^ω^ )
春休み中にできれば…(´・_・`)

それでは、また。