G. MATLABで計算したデータを Mathematica に持って行く

こちらの知識が足りないのか、 ときどき 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.}}

\includegraphics[width=15cm]{eps/matlabtomathematica.eps}

メモリーの中での並び順は「転置されて」しまっているけれど、 MATLAB の u(i,j) は Mathematica の u[[i,j]] と等しいので、 混乱することはないだろう。

単に -ascii とすると上に見るように8桁精度なので、 それが不満な場合は
>> save('~/matlab.dat','u','-ascii', '-double')
とする。こうすれば 16 桁精度で出力する (当然ファイルは大きくなる)。


(追記) 実はこれを書いている今知ったのだが、 Mathematica は、 MATLAB の MAT ファイルの古い形式 (v4, v5) をサポートしている。 MATLAB で
>> save('matlab.dat','u', '-mat')
あるいは
>> save('matlab.mat','u')
(拡張子 .mat を選ぶと、 自動的に , '-mat' というオプションを指定したのと同じことになる)
として出力したファイルを、Mathematica では
In[ ] := u=Import["matlab.dat","MAT"]
あるいは
In[ ] := u=Import["matlab.mat"]
で読める。 (例えば u が2次元配列であれば、 ListPlot3D[u] とすればグラフが描ける。)


以下、余談 (と言っても実際に必要が生じて、やる羽目になったので、 案外無駄にならないメモかも知れない)。

MATLAB で計算する際は、精度を上げたいので、大規模な計算をするけれど、 その計算結果 (2GB弱だったかな) をそのまま Mathematica に渡すと、 Mathematica がパンクする (「読めない」と言うのではなくて、 プロセスが終了してしまう!) ということがあった。 実際は可視化したいだけで、その目的のためには、 計算結果が全部は必要ないという場合は、 適当に間引いて軽いデータにしてから Mathematica に渡してやれば良い。 そこで次のようなことをした。

正方形上の関数があり、 各辺を $ 1280$ 等分して作ったメッシュで関数値を計算した。 外部に出力するときに、 各辺を $ 160$ 等分して作ったメッシュ上の関数値を抜き出したい。
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');
smallu=u(i,j); という書き方が出来るのが MATLAB の面白いところ。

桂田 祐史
2017-06-19