2014-02-21 49 views
2

我想使用fprintf写入数据文件。说我有包含这样的数据的矩阵:fprintf打印字符和数字没有循环

Values = [ 1, 735123.0, 23, 24, 25; 
      2, 735123.5, 34, 35, 36; 
      ... 
      8000, 739122.5, 21, 22, 43] 

我可以用写一个文件:

fprintf(FileID, '%d, %f, %d, %d, %d', Values') 

但实际上该第二列表示时间(datestr(735123.5)= 11-Sep- 2012 12:00:00)我想fprintf中打印日期在数据文件中的第二列,因此该文件将读取

1, 11-Sep-2012 00:00:00, 23, 24, 25 
2, 11-Sep-2012 12:00:00, 34, 35, 36 
... 
8000, 24-Aug-2023 12:00:00, 21, 22, 43 

我矩阵是成千上万行的长,所以我更喜欢不必循环 逐行。

任何建议如何进行?

回答

0

喜欢的东西

n = num2cell(Values'); 
n(2,:) = cellfun(@datestr, n(2, :),'UniformOutput', false); 
fprintf(FileID, '%d, %s, %d, %d, %d', n{:}); 

虽然cellfun基本上是一个循环。

+0

完美,谢谢。我正在尝试mat2cell,并没有工作。 cellfun似乎比我的循环更快。或者也许是'UniformOutput'部分。 – EddyTheB

+1

此外,为了将来的参考,我已经使用'@(x)datestr(x,'dd-mm-yyyy HH:MM:SS')'而不是'@datestr'来确保午夜时间的输出。 – EddyTheB

0

没有for循环或cellfun

separator = repmat(', ',size(Values,1),1); %// column used as separator 
lineFeeds = repmat('\n',size(Values,1),1); %// column of line feeds 
string = [ num2str((Values(:,1))) ... 
      separator ... 
      datestr(Values(:,2)) ... 
      separator ... 
      num2str(Values(:,3)) ... 
      separator ... 
      num2str(Values(:,4)) ... 
      separator ... 
      num2str(Values(:,5)) ... 
      lineFeeds ]; 
string = reshape(string.',1,[]); %'// put everything in one row 
FileID = fopen('tmp.txt', 'wt'); %// use 't', or '\n' may not get written to file 
fprintf(FileID, string); 
fclose(FileID);