MATLABデータの移行

 

MATLABとMuPADでデータの移行が可能です。MATLAB側で変数をsymかsymsを用いて定義し、setVarとgetVarを使います。コマンドはMATLAB上で行い、MuPADのnotebookのハンドルハンドル番号が必要です。MATLABはsym形式、MuPADはリスト形式で変数が移行されます。MATLABの倍精度の変数はsym形式では分数に変換されるのでデータが大きくなるので注意が必要です。

 

>> np=mupad(filename);% >>の後に半角スペースを含めること!

>> syms x;

>> a=sym([1,1/2,sqrt(3),pi,0.3]);

>> b=[x^(-1/3)-1,exp(x);sin(x),diff(1/x)];

>> setVar(np,a);

>> setVar(np,b);

a;b;

matrix([[1, 1/2, 3^(1/2), PI, 3/10]])
matrix([[1/x^(1/3) - 1, exp(x)], [sin(x), -1/x^2]])

逆にMuPADからMATLABへ変数を移行するにはgetVarを使います。
ギリシア文字はSymbol::alphaとして表示しています。

a:=[[0.5,PI,4.0-5.0*I],[3^(-1/2),E^(-1),(2-5^(1/2))/2]];
b:=[x^(-2/3),ln(x),cos(Symbol::alpha)];

[[0.5, PI, 4.0 + (- 5.0*I)], [3^(1/2)/3, 1/exp(1), 1 - 5^(1/2)/2]]
[1/x^(2/3), ln(x), cos(`α`)]

MATLAB上で適当な変数名を指定する必要があります。

ギリシア文字αはMuPADでは認識されますが、MATLABでは認識されません。

 

>> clear a b x;% >>の後ろに半角スペースを含むこと!

>> a=getVar(np,'a');

>> b=getVar(np,'b');

>> a,b

 

a =

[ [0.5, pi, 4.0 - 5.0*i], [3^(1/2)/3, 1/exp(1), 1 - 5^(1/2)/2]]

b =

[ 1/x^(2/3), log(x),   cos(α)]

 

大規模データだと倍精度からsymにするとデータサイズが巨大化します。一旦倍精度形式でファイルにしてMuPADの数値リストとして読み込むほうが楽です。MuPADはdefaultではbig endianなのでlittle endianを指定する必要があります。

まずfrandomを使って0~1の乱数の数値配列を作成します。エコーバックが邪魔なのでコロン(:)を使います。

chn:=204:smp:=1024://chn channel×smp sampleのデータを仮定
x:=[frandom() $ i=1..(chn*smp)]://chn×smp個の乱数リストを作成。系列にしないこと!
A:=hfarray(1..chn,1..smp,x)://数値配列に変換

writebytesを使ってファイル名をtest.datという名前で保存します。数値配列はwritebytesでは倍精度で保存されます。

filename:="test.dat":
writebytes(filename,A,LittleEndian);//数値配列Aを倍精度でfilenameというファイル名にして保存。

readbytesを使って保存したファイルデータを読み込みます。数値配列として読み込むにはoptionとしてReturnType=DOM_HFARRAYを付けます。データの大きさはnopsを使って取得します。チャンネル数は既知とします。

B:=readbytes(filename,LittleEndian,ReturnType=DOM_HFARRAY):
type(B);//数値配列です。
chn:=204:smp:=nops(B)/chn;
B:=hfarray(1..chn,1..smp,[op(B)])://chn×smpの配列に変換する
max(abs(A-B));//検算
C:=matrix(B)://数値配列を行列に変換。

DOM_HFARRAY
1024
0.0