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;
逆に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)];
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)://数値配列を行列に変換。