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

Ant*_*Ant 5 csv file-io matlab concatenation

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

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

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

    columnsHeader = cell(1,15)
Run Code Online (Sandbox Code Playgroud)

我用计算结果填写; 例如:

    columnsHeader{1}  = propertyStringOne (where propertyStringOne = 'Liq')
Run Code Online (Sandbox Code Playgroud)

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

    labelledNumbersTable=cat(1,columnsHeader,numbersTable)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误,连接类型需要相同.所以我尝试使用cell2mat转换标签/字符串:

    columnsHeader = cell2mat(columnsHeader);
    labelledNumbersTable = cat(1,columnsHeader,numbersTable)
Run Code Online (Sandbox Code Playgroud)

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

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

CAT参数维度不一致.

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

gno*_*ice 6

您必须以两种不同的方式处理将列标题和数字数据写入文件.输出字符串的单元格数组必须使用FPRINTF函数完成,如本文档中所述,用于将单元格数组导出到文本文件.然后,您可以使用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
Run Code Online (Sandbox Code Playgroud)


Amr*_*mro 6

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

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

举例来说明差异:

%# 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
Run Code Online (Sandbox Code Playgroud)

我的机器上的时间如下:

Elapsed time is 0.786070 seconds.    %# FPRINTF
Elapsed time is 6.285136 seconds.    %# DLMWRITE
Run Code Online (Sandbox Code Playgroud)