Problem concatenating a matrix of numbers with a vector of strings (column labels) using cell2mat

后端 未结 2 776
无人及你
无人及你 2020-12-06 14:10

I\'m a Mac user (10.6.8) using MATLAB to process calculation results. I output large tables of numbers to .csv files. I then use the .csv files in EXCEL. This all works f

相关标签:
2条回答
  • 2020-12-06 14:18

    The solution to the problem is already shown by others. I am sharing a slightly different solution that improves performance especially when trying to export large datasets as CSV files.

    Instead of using DLMWRITE to write the numeric data (which internally uses a for-loop over each row of the matrix), you can directly call FPRINTF to write the whole thing at once. You can see a significant improvement if the data has many rows.

    Example to illustrate the difference:

    %# some random data with column headers
    M = rand(100000,5);                                          %# 100K rows, 5 cols
    H = strtrim(cellstr( num2str((1:size(M,2))','Col%d') ));     %'# headers
    
    %# FPRINTF
    tic
    fid = fopen('a.csv','w');
    fprintf(fid,'%s,',H{1:end-1});
    fprintf(fid,'%s\n',H{end});
    fprintf(fid, [repmat('%.5g,',1,size(M,2)-1) '%.5g\n'], M');  %'# default prec=5
    fclose(fid);
    toc
    
    %# DLMWRITE
    tic
    fid = fopen('b.csv','w');
    fprintf(fid,'%s,',H{1:end-1});
    fprintf(fid,'%s\n',H{end});
    fclose(fid);
    dlmwrite('b.csv', M, '-append');
    toc
    

    The timings on my machine were as follows:

    Elapsed time is 0.786070 seconds.    %# FPRINTF
    Elapsed time is 6.285136 seconds.    %# DLMWRITE
    
    0 讨论(0)
  • 2020-12-06 14:21

    You will have to handle writing the column headers and the numeric data to the file in two different ways. Outputting your cell array of strings will have to be done using the FPRINTF function, as described in this documentation for exporting cell arrays to text files. You can then output your numeric data by appending it to the file (which already contains the column headers) using the function DLMWRITE. Here's an example:

    fid = fopen('myfile.csv','w');              %# Open the file
    fprintf(fid,'%s,',columnsHeader{1:end-1});  %# Write all but the last label
    fprintf(fid,'%s\n',columnsHeader{end});     %# Write the last label and a newline
    fclose(fid);                                %# Close the file
    dlmwrite('myfile.csv',numbersTable,'-append');  %# Append your numeric data
    
    0 讨论(0)
提交回复
热议问题