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

Posted

技术标签:

【中文标题】使用 cell2mat 将数字矩阵与字符串向量(列标签)连接起来的问题【英文标题】:Problem concatenating a matrix of numbers with a vector of strings (column labels) using cell2mat 【发布时间】:2011-09-26 04:41:03 【问题描述】:

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

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

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

    columnsHeader = cell(1,15)

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

    columnsHeader1  = propertyStringOne (where propertyStringOne = 'Liq')

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

    labelledNumbersTable=cat(1,columnsHeader,numbersTable)

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

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

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

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

CAT 参数尺寸不一致。

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

【问题讨论】:

如何将数字数据写入 CSV 文件? 我在做:csvwrite(path,table),其中 path 是保存文件的位置,table 是最终的(标记的)表。当表格只有数字时,它可以工作。 【参考方案1】:

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

fid = fopen('myfile.csv','w');              %# Open the file
fprintf(fid,'%s,',columnsHeader1:end-1);  %# Write all but the last label
fprintf(fid,'%s\n',columnsHeaderend);     %# Write the last label and a newline
fclose(fid);                                %# Close the file
dlmwrite('myfile.csv',numbersTable,'-append');  %# Append your numeric data

【讨论】:

感谢 gnovice,但 xlswrite 对我不起作用——我想是因为我在 Mac 上。我尝试使用它,但没有 EXCEL 文件。 谢谢新手!您的创造性解决方案奏效了。这个问题困扰我很久了。非常感谢您的帮助。【参考方案2】:

其他人已经展示了问题的解决方案。我正在分享一个稍微不同的解决方案,它可以提高性能,尤其是在尝试将大型数据集导出为 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,',H1:end-1);
fprintf(fid,'%s\n',Hend);
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,',H1:end-1);
fprintf(fid,'%s\n',Hend);
fclose(fid);
dlmwrite('b.csv', M, '-append');
toc

我的机器上的时间如下:

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

【讨论】:

感谢 Amro 抽出时间来做这件事。我一定会试一试的。

以上是关于使用 cell2mat 将数字矩阵与字符串向量(列标签)连接起来的问题的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何将一个cell转换成数值型或字符串型

matlab如何将一个cell转换成数值型或字符串型

matlab怎样把cell函数转换为一般矩阵形式

matlab怎样把cell函数转换为一般矩阵形式?

matlab怎样把cell函数转换为一般矩阵形式?

matlab数组与矩阵