使用cell2mat将数字矩阵与字符串向量(列标签)连接起来的问题

时间:2011-06-30 17:32:27

标签: matlab file-io csv concatenation

我是Mac用户(10.6.8),使用MATLAB处理计算结果。我输出大型数字表到.csv文件。然后我在EXCEL中使用.csv文件。一切正常。

问题是每列数字都需要一个标签(一个字符串标题)。我无法弄清楚如何将标签连接到数字表。我非常感谢任何建议。以下是一些可能有用的进一步信息:

我的标签包含在单元格数组中:

    columnsHeader = cell(1,15)

我填写计算结果;例如:

    columnsHeader{1}  = propertyStringOne (where propertyStringOne = 'Liq')

每个计算的标签序列都不同。我的第一次尝试是尝试直接连接标签:

    labelledNumbersTable=cat(1,columnsHeader,numbersTable)

我收到的错误是连接类型必须相同。所以我尝试使用cell2mat转换标签/字符串:

    columnsHeader = cell2mat(columnsHeader);
    labelledNumbersTable = cat(1,columnsHeader,numbersTable)

但这需要所有单独的标签并将它们组成一个长字......这导致:

  

???使用==>时出错猫

     

CAT参数维度不一致。

有没有人知道可以让我保留原始单元格标签的替代方法?

2 个答案:

答案 0 :(得分:6)

您必须以两种不同的方式处理将列标题和数字数据写入文件。输出字符串的单元格数组必须使用FPRINTF函数完成,如this documentation for exporting cell arrays to text files中所述。然后,您可以使用函数DLMWRITE将数字数据附加到文件(已包含列标题),从而输出数字数据。这是一个例子:

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

答案 1 :(得分:6)

其他人已经表明了问题的解决方案。我正在分享一个稍微不同的解决方案,可以提高性能,尤其是在尝试将大型数据集导出为CSV文件时。

不是使用DLMWRITE来编写数值数据(内部在矩阵的每一行上使用for循环),而是可以直接调用FPRINTF来一次写入整个事物。如果数据有很多行,您可以看到显着的改进。

说明差异的例子:

%# 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

我的机器上的时间如下:

Elapsed time is 0.786070 seconds.    %# FPRINTF
Elapsed time is 6.285136 seconds.    %# DLMWRITE