如何在Matlab中重命名表变量?

3
我想要从一组光谱数据的矩阵中创建一个表格,使用一个特定的变量列表(这里对应于1000个光谱波长值的列),而不是手动输入名称。为此,我使用array2table函数,Matlab文档显示行的名称和变量的标签必须作为单元格数组(而不是矩阵)放置。因此,我需要首先将我的x轴(光谱波长)转换为单元格数组。我使用以下操作: C = num2cell(xaxis); % 将其转换为单元格数组(每个单元格包含1个值) isvarname C % 检查该变量是否可作为单元格数组 T = array2table(R,'RowNames', concentration,'VariableNames',C); 这里: R是矩阵,concentration是一个1x500的单元格数组,xaxis是1x1000的光谱数据波长(它的范围从600到1800,几乎没有空值)。
不幸的是,我得到了以下错误: "Error using array2table (line 62) The VariableNames property must be a cell array, with each element containing one nonempty string."
这意味着我无法正确输入列(变量)名称(然而,行名称却可以正常工作)。 注意:我尝试过T.Properties.VariableNames = c但也不起作用。
我查看了其他关于表格名称值的帖子,但没有帮助。你对此有什么想法吗? 非常感谢。

你试过这个吗:https://www.mathworks.com/help/matlab/matlab_prog/modify-units-descriptions-and-table-variable-names.html?requestedDomain=www.mathworks.com - beastlyCoder
1个回答

2

也许您输错了代码,但看起来您正在使用数组xaxis而不是C。无论如何,我建议您尝试以以下方式将单元格内容转换为字符串:

T = array2table(R,'RowNames', concentration,'VariableNames',cellfun(@(x)num2str(x),num2cell(xaxis),'uniformoutput',false));

编辑

table文档中可以得知:

变量名是一个由字符向量组成的单元格数组,这些字符向量非空且不重复。变量名作为以逗号分隔的键值对 'VariableNames' 的一部分进行指定。分配的变量名必须是MATLAB®有效的变量名,可以使用isvarname函数确定有效变量名。

此外,isvarname函数说明:

有效的变量名以字母开头,长度不超过namelengthmax字符,可以包括字母、数字和下划线。MATLAB关键字不能作为变量名。要确定输入是否为MATLAB关键字,请使用iskeyword函数。

这意味着您不能直接将xaxis值用作变量名,您至少需要添加一个字符并删除小数点。您可以使用以下代码完成此操作:

T = array2table(R,'RowNames', concentration,...
    'VariableNames',cellfun(@(x)['wavel_',regexprep(num2str(x),'.','_')],num2cell(xaxis),'uniformoutput',false));

这段代码将在数字字符串值前添加 'wavel_'。它还使用 regexprep 函数将点替换为下划线。然而,这似乎是不必要的,因为列名并不真正具有信息性。如果您不提供 'variableNames' 选项,则 array2table 函数的文档说明如下:

如果没有可用作变量名的有效 MATLAB 标识符,则 MATLAB 使用一个 N 个字符向量形式为 {'Var1' ... 'VarN'} 的单元数组,其中 N 是变量数。

也许使用默认变量名就足够了。

看起来不错,但是由于x轴是由数字组成的,我得到了以下错误:“'600.669'不是一个有效的变量名。” - user7350419
如果您真的想使用数字作为变量名,那么您可以使用regexprep将点替换为下划线。我会检查一下是否允许这样做。 - lucianopaz
亲爱的Lucianopaz,非常感谢您宝贵的意见。然而,当我仅使用x轴的前3个数字(600、602、... 1800)时,它不起作用。也许只有数字是不允许的? - user7350419
你是对的,只允许使用数字是不行的。变量名必须以字母开头。 - lucianopaz
1
@arno,我知道MATLAB在为表中的变量命名方面有其局限性,但我认为我的答案指出了这些局限性并提出了如何解决它们的建议。除此之外,还需要什么才能让您接受我的答案是正确的呢? - lucianopaz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接