微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 Matlab 中的元胞数组结构表现不佳并不断构建向量?

如何解决为什么 Matlab 中的元胞数组结构表现不佳并不断构建向量?

假设我有两个简单的向量;

dput(tab)
structure(list(Groups = structure(c(1L,1L,2L,2L),.Label = c("G1","G2"),class = "factor"),Species = structure(c(1L,3L,1L),.Label = c("SP1","SP2","SP3"),evalue = c(1,0.5,1.2,0.02,2.2,2.1),bits = c(120L,130L,100L,190L,390L,400L,67L,69L),NAME = structure(c(1L,4L,6L,5L,.Label = c("A","B","C","X","Y","Z"),class = "factor")),class = "data.frame",row.names = c(NA,-8L))

现在我用它们制作一个元胞数组。

vec1=[1,2,3];
vec2=[4,5,6];

如果我想创建一个 2x3 的数值数组,很简单。

cellArray1={vec1,vec2}

但是,要根据上述内容制作 2x3 元胞数组,它的行为并不符合预期。

[vec1;vec2]
%or
[cellArray1{1};cellArray{2}]

没有给我一个 2x3 的元胞数组。为什么会这样,以及如何以非常正式和有效的方式制作一个 2x3 元胞数组,其中每个条目只包含双精度值。我不认为使用 {vec1(1,:);vex2(1,:)} {cellArray1{1};cellArray1{2}} {cellArray1{1}(1,:),cellArray1(1,:)} 或编写代码来编写另一个带有 cell2mat 的 dot m 文件,该文件运行生成的新文件会创建感兴趣的元胞数组。

解决方法

这是设计使然。

元胞数组可以包含任何东西,因此该语言没有经过优化以解释事物具有相同的形状。

如果 size(vec1(1,:)) 是 1x1 并且 size(vex2(1,:)) 是 1x50,下面的应该仍然有效(与 [] 不同)。

{vec1(1,:);vex2(1,:)}

如果 cellArray1{1} 是图形句柄而 cellArray1{2} 是字符串,则以下 应该 仍然有效(与 [] 不同)。

{cellArray1{1};cellArray1{2}}

请参阅第一个示例以了解为什么它应该适用于任何形状:

{cellArray1{1}(1,:),cellArray1(1,:)}

元胞数组接受很多东西作为输入,没问题。所以他们不能假设你输入来创建单元格是一个 1x3 数值数组,因此他们不能像它那样表现并创建一个 2x3 单元格数组。即使他们可以检查并相应地采取行动,那么您的行为也会不一致,具体取决于输入的数值向量的长度。

方括号实际上可以假设两个向量的大小相同,否则会出错。

将元胞数组视为可以在每个元素中包含任何内容的列表,而不是数值数组。如果您只有数值数组,建议您使用它,向量/矩阵,而不是元胞数组。

,

这是在不使用 cell2mat 或代码文件编写然后运行编写的代码文件的情况下获取我在问题中想要的数据结构的一种方法。

[num2cell(cellArray1{1});num2cell(cellArray1{2})]
% or
vertcat(num2cell(cellArray1{1}),num2cell(cellArray1{2}))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。