こちらの知識が足りないのか、 ときどき Mathematica に持って行ってそちらで処理したくなることがある。
ごく普通に ASCII データで出力して、それを読めば良いかと。
MATLAB側で
>> u=1:12;
>> u=reshape(u,3,4)
u =
1 4 7 10
2 5 8 11
3 6 9 12
>> save('~/matlab.dat','u','-ascii')
どんな中身?
% cat matlab.dat
1.0000000e+00 4.0000000e+00 7.0000000e+00 1.0000000e+01
2.0000000e+00 5.0000000e+00 8.0000000e+00 1.1000000e+01
3.0000000e+00 6.0000000e+00 9.0000000e+00 1.2000000e+01
%
Mathematica では
In[1] := u=Import["matlab.dat"]
Out[1] = {{1., 4., 7., 10.}, {2., 5., 8., 11.}, {3., 6., 9., 12.}}
メモリーの中での並び順は「転置されて」しまっているけれど、 MATLAB の u(i,j) は Mathematica の u[[i,j]] と等しいので、 混乱することはないだろう。
単に -ascii とすると上に見るように8桁精度なので、 それが不満な場合は
>> save('~/matlab.dat','u','-ascii', '-double') |
(追記) 実はこれを書いている今知ったのだが、 Mathematica は、 MATLAB の MAT ファイルの古い形式 (v4, v5) をサポートしている。 MATLAB で
>> save('matlab.dat','u', '-mat')あるいは >> save('matlab.mat','u')(拡張子 .mat を選ぶと、 自動的に , '-mat' というオプションを指定したのと同じことになる) |
In[ ] := u=Import["matlab.dat","MAT"]あるいは In[ ] := u=Import["matlab.mat"] |
以下、余談 (と言っても実際に必要が生じて、やる羽目になったので、 案外無駄にならないメモかも知れない)。
MATLAB で計算する際は、精度を上げたいので、大規模な計算をするけれど、 その計算結果 (2GB弱だったかな) をそのまま Mathematica に渡すと、 Mathematica がパンクする (「読めない」と言うのではなくて、 プロセスが終了してしまう!) ということがあった。 実際は可視化したいだけで、その目的のためには、 計算結果が全部は必要ないという場合は、 適当に間引いて軽いデータにしてから Mathematica に渡してやれば良い。 そこで次のようなことをした。
正方形上の関数があり、 各辺を 等分して作ったメッシュで関数値を計算した。 外部に出力するときに、 各辺を 等分して作ったメッシュ上の関数値を抜き出したい。
N=1280 u=zeros(N+1,N+1); ... i=1:N/160:N+1; j=1:N/160:N+1; smallu=u(i,j); save('nantoka.dat','smallu','-ascii'); |
2017-06-19