MATLAB Answers

pythonの配列をmatlab engineに渡すときにエラーが出ます

10 views (last 30 days)
matlab engineを用いてpython(python3.7)からmatlab(MATLAB2019b)の関数eig(一般固有値解析)を用いる際に
MatlabExecutionError: データ型が無効です。入力行列は double または single でなければなりません。」というエラーが生じます。
コードは以下の通りです。
import matlab.engine
import math
eng=matlab.engine.start_matlab()
A = [[1/math.sqrt(2),0], [0, 1]]
B = [[0,1], [-1/math.sqrt(2) ,0]]
[V,D]=eng.eig(A,B)
この原因は行列A,Bにあり、matlabが計算できる形にする必要があると思い、以下のようにコードを改変しましたが、
MatlabExecutionError: cell から double に変換できません。」というエラーが生じて、行列をdouble化できませんでした。
import matlab.engine
import math
eng=matlab.engine.start_matlab()
A = [[1/math.sqrt(2),0], [0, 1]]
B = [[0,1], [-1/math.sqrt(2) ,0]]
Ad=eng.double(A)
Bd=eng.double(B)
[V,D]=eng.eig(Ad,Bd)
これらのエラーを解消し、固有値解析をmatlab engineで行うにはどのようにすればよいでしょうか?

  1 Comment

Yusuke Higuchi
Yusuke Higuchi on 5 Mar 2020
途中経過です。
import matlab.engine
import math
eng=matlab.engine.start_matlab()
A = matlab.double([[1/math.sqrt(2),0], [0, 1]])
B = matlab.double([[0,1], [-1/math.sqrt(2) ,0]])
[V,D]=eng.eig(A,B)
このようにmatlab.doubleを用いれば解析は回りましたが、次は答えのV,Dの値がおかしいです。
MATLAB本体で行うと、
A = [1/sqrt(2) 0; 0 1];
B = [0 1; -1/sqrt(2) 0];
[V,D]=eig(A,B)
V =
1.0000 + 0.0000i 1.0000 + 0.0000i
0.0000 - 0.7071i 0.0000 + 0.7071i
D =
0.0000 + 1.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 - 1.0000i
とV及びDは行列表記となりますが、pythonでmatlab engineを利用して同様に解くとV=1j, D=-1jとなりスカラーで返されます。これはmatlab engineのエラーでしょうか?

Sign in to comment.

Accepted Answer

Kojiro Saito
Kojiro Saito on 6 Mar 2020
MATLABエンジンはデフォルトでは1つの出力しか返さないので、今回のように出力引数を2にする場合は、nargout=2を付ける必要があります。
最後の行だけ変更すると、VとDの値が正しく格納されると思います。
[V,D]=eng.eig(A,B,nargout=2)

  1 Comment

Yusuke Higuchi
Yusuke Higuchi on 6 Mar 2020
ありがとうございます!
確認できました!

Sign in to comment.

More Answers (0)

Products


Release

R2019b