【问题标题】:fprintf print chars and num with no loopsfprintf 打印字符和数字,没有循环
【发布时间】:2023-03-16 21:36:03
【问题描述】:

我正在尝试使用 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 

我的矩阵有数千行,所以我不想逐行循环。

有什么建议吗?

【问题讨论】:

    标签: matlab printf


    【解决方案1】:

    类似

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

    虽然cellfun基本上是个循环。

    【讨论】:

    • 完美,谢谢。我正在尝试 mat2cell 并且没有用。与我的循环相比,cellfun 似乎足够快。或者可能是“UniformOutput”部分。
    • 另外,为了将来参考,我使用了 '@(x) datestr(x, 'dd-mm-yyyy HH:MM:SS')' 而不是 '@datestr'确保输出午夜的时间。
    【解决方案2】:

    没有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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      相关资源
      最近更新 更多