1

MATLAB で 4D 行列 (M-(16x,101x,101x,6x) を高精度 ('precision'-'%1.40f') でファイルに書き込む必要があります。

多次元行列を見つけましsave('filename.mat', 'M' );たが、精度を設定できません (-double のみ)。一方dlmwrite('filename.txt', M, 'delimiter', '\t', 'precision', '%1.40f');、精度を設定することがわかりましたが、2次元配列に限定されています。

誰かが私の問題に取り組む方法を提案できますか?

4

2 に答える 2

3

MATLAB の倍精度数が 16 桁しか保持しない場合、小数部の 40 桁を格納するポイントは何ですか? このコードを試してください:

t=pi
whos
fprintf('%1.40f\n',t)

出力は

Name      Size            Bytes  Class     Attributes
t         1x1                 8  double              

3.1415926535897931000000000000000000000000

このコマンドsave('filename.mat', 'M' );は、数値をバイナリ表現 (倍精度数ごとに 8 バイト) で格納します。これは、プレーンテキスト表現と比較して省スペースという点で無敵です。

4D 形状に関しては、j_kubikが提案した方法は十分に単純に思えます。

于 2013-06-26T04:51:08.680 に答える
1

私は常にsave、matlab に格納するために既に使用されている精度で、既に持っているのとまったく同じ数値を格納すると考えていました。何も失うことはありません。唯一の問題は、ディスク容量の消費 (正確すぎる数値?) と .mat ファイルのクローズド フォーマット (外部プログラムから読み取ることができない) かもしれません。データを保存して、後で matlab で読み取るだけなら、間違いなくsave. saveascii データを出力することもできますが、(as dlmwrite) 2D 配列に制限されているため、この場合は使用dlmwriteする方が適切です。

別の解決策:

tmpM = [size(M), 0, reshape(M, [], 1)];
dlmwrite('filename.txt', tmpM, 'delimiter', '\t', 'precision', '%1.40f');

読むのは少し難しくなりますが、ほんの少しです ;)

fopen次に、 &を使用してファイルに何かを書き込む独自の関数を作成するだけですfprintf(ちょうどdlmwriteそうです) - そこで、ファイル形式のあらゆる側面 (精度を含む) を制御できます。

精度、ファイルサイズ、および実行時間を本当に気にかけている場合 (これはおそらくあなたの方法ではありません)、行列パラメーターを取り、それをコピーするだけでバイナリ ファイルに格納する mex 関数を作成することです。 matlab からの生データ バッファー。また、配列の次元を示す必要があり、おそらく最も速いでしょう(まだsave似たようなことをしていないかどうかはわかりません)。

于 2013-06-26T04:25:51.860 に答える