2013-06-26 121 views
1

我需要將4D矩陣(M-(16x,101x,101x,6x)寫入高精度文件('precision' - '% 1.40f')在MATLAB中。在Matlab中將4D矩陣保存爲高精度文件(%1.40f)

我發現save('filename.mat', 'M');多維矩陣,但精度不能設置(只有 - 雙)。另一方面,我發現dlmwrite('filename.txt', M, 'delimiter', '\t', 'precision', '%1.40f');設置精度,但只限於二維陣列。

有人可以建議的方式與我的問題來解決?

+3

請記住,如果需要,您可以將您的4-D陣列「重塑」爲2D並返回... – bla

回答

1

我一直以爲save將alrea存儲完全相同的號碼,你dy有已經用於將它們存儲在matlab中的精度 - 你不會失去任何東西。唯一的問題可能是磁盤空間消耗(太精確的數字?)和.mat文件的封閉格式(不能被外部程序讀取)。如果我想存儲數據並稍後用matlab讀取它們,我肯定會用savesave也可以打印ascii數據,但是(如dlmwrite)限於二維數組,所以使用dlmwrite會比較適合您的情況。

另一種解決方案:

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

讀書會有點難度,但只有一點點;)

然後,你可以寫自己的函數寫的東西用一個文件fopen & fprintf (就像dlmwrite一樣) - 您可以控制文件格式的各個方面(包括精度)。

如果我真的關心精度,文件大小和執行時間(這可能不是你的方式),我會做的事情是編寫一個mex函數,它需要一個矩陣參數並將其存儲在二進制文件中文件只需從matlab複製原始數據緩衝區。它也需要一些數組尺寸的指示,並且可能是最快的(不知道save還沒有做類似的事情)。

+0

不錯!然而'M(:)'可能比'reshape(M,[],1)'更整齊。 – pm89

+1

@ pm89我同意'M(:)'很整潔,但你必須記住新陣列的形狀。像這樣'tmpM = [size(M),0,M(:)'];'或這個'tmpM = [size(M); 0; M(:)];'。 – anandr

+0

我不確定它背後的實際實現是什麼,但是M(:)和'reshape(M,[],1)'完全一樣。我更喜歡後者,因爲迷信實施'reshape'可能不需要在整形時複製整個數組。如果我有一個時刻,有一天我會研究這種差異。 –

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建議看起來夠簡單。