2015-08-21 129 views
1

我正在使用Matlab R2015a,並且希望將雙精度矩陣保存到txt文件中。一些指數有NaN值。所有其他值,儘管double作爲格式,基本上是整數。沒有小數值。Matlab,如何保存txt文件,使用保存功能,將雙精度保存爲整數,但保留NaN

我寧願如果保存的值在txt文件中顯示爲整數,當然除了NaN值,必須保持NaN。我的數據

實例,以及應如何出現在保存的txt文件:

NaN 81 272 
NaN 787 314 
778 174 606 
427 720 677 

我可以在循環中使用fprintf做到這一點,或用單dlmwrite,但是這兩種方法都非常對於大型矩陣,緩慢。使用save功能是快得多,但我不知道如何實現所需的輸出(其中雙打被寫爲整數,並保留NaN的)此外,由save產生的文件大小相當大,因爲的格式。使用保存功能

輸出示例:

  NaN 8.1000000e+01 2.7200000e+02 
      NaN 7.8700000e+02 3.1400000e+02 
7.7800000e+02 1.7400000e+02 6.0600000e+02 
4.2700000e+02 7.2000000e+02 6.7700000e+02 

下面是一個簡單的代碼示例,同時使用dlmwrite(所希望的輸出,但慢),和save(不期望的輸出,但快)。

% generate some data 
m = round(rand(1000,3)*1000); 
m(1:10,1) = NaN; 

% dlmwrite method. Using dlmwrite to create header line and append the data. 
% Output is as desired. 
dlmwrite('file_by_dlmwrite.txt', 'column1 column2 column3', 'delimiter', ''); 
dlmwrite('file_by_dlmwrite.txt', m, 'delimiter', ' ', '-append'); 

% save method. Using dlmwrite only for the header line, and save function to append the data. 
% Output is not as desired. 
dlmwrite('file_by_save.txt', 'column1 column2 column3', 'delimiter', ''); 
save('file_by_save.txt', 'm', '-ascii', '-append'); 

任何意見,將不勝感激。

+0

我假設你有一個很好的理由不使用保存寫入二進制文件? – crowdedComputeeer

回答

3

您試過fprintf沒有一個循環?

m = round(rand(1000,3)*1000); 
m(1:10,1) = NaN; 
% 
filename='file_by_fprintf.txt'; 
dlmwrite(filename, 'column1 column2 column3', 'delimiter', ''); 
fid=fopen(filename,'a'); 
fprintf(fid,'%7d %7d %7d\n',m'); 
fclose(fid); 

使用較大的測試用例100000代替1000給我

Elapsed time is 4.290399 seconds. 
Elapsed time is 0.207824 seconds. 
Elapsed time is 0.123091 seconds. 

其中第一個是你的dlmwrite,第二個是你的save,第三個是我的。

+0

謝謝!我對此感到非常高興!我不知道爲什麼,但我從來沒有意識到'fprintf'可以一次完成。另外,在寫之前我會注意到數據的轉置。 – ctp

+0

@ctp的確,你需要轉置,因爲'fprintf'以列主要的方式訪問它的變量。很容易記住,如果你想象它基本上是'm(:)',暗示你通常需要這種轉置。 –