假设我有两个简单的向量;
vec1=[1,2,3];
vec2=[4,5,6];
现在我用它们做一个细胞阵列。
cellArray1={vec1,vec2}
如果我想创建一个2x3的数字数组,它很简单。
[vec1;vec2]
%or
[cellArray1{1};cellArray{2}]
然而,要从上面制作一个2x3单元阵列,它的行为并不像预期的那样。
{vec1(1,:);vex2(1,:)}
{cellArray1{1};cellArray1{2}}
{cellArray1{1}(1,:),cellArray1(1,:)}
没有人给我一个2x3的细胞阵列。为什么会这样,以及如何以一种非常正式和高效的方式创建一个2x3单元数组,该数组的每个条目中只包含双值。我不认为使用cell2mat
或用{~,~,~;~,~,~}
编写另一个点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单元数组。即使他们可以检查并采取相应的行动,那么你也会有不一致的行为,这取决于输入的数值向量的长度
方括号实际上可以假设两个向量的大小相同,否则会出错。
将Cell数组视为可以在每个元素中包含任何内容的列表,而不是数字数组。如果你只使用数值数组,建议你使用向量/矩阵,而不是单元数组。
这里有一种方法可以获得我在问题中想要的数据结构,而无需使用cell2mat
或代码文件编写然后运行编写的代码文件。
[num2cell(cellArray1{1});num2cell(cellArray1{2})]
% or
vertcat(num2cell(cellArray1{1}),num2cell(cellArray1{2}))