将两个n维单元阵列组合成n×n维单元阵列

时间:2014-12-19 18:34:44

标签: matlab cell-array

我想知道如何在MATLAB中做到这一点。

我有a={1;2;3}并想创建一个单元格数组

{{1,1};{1,2};{1,3};{2,1};{2,2};{2,3};{3,1};{3,2};{3,3}}.

如果没有for循环,我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

您可以使用allcomb from MATLAB File-exchange来帮助您 -

mat2cell(allcomb(a,a),ones(1,numel(a)^2),2)

答案 1 :(得分:1)

只是为了好玩,使用kronrepmat

a = {1;2;3}

b = mat2cell([kron(cell2mat(a),ones(numel(a),1)) repmat(cell2mat(a),numel(a),1)])

此处方括号[​​]用于执行两个列向量的concatenation,其中每个向量都由kronrepmat定义。

这很容易推广,但我怀疑这是最有效/最快的解决方案。

答案 2 :(得分:0)

使用repmat和mat2cell

A = {1;2;3};
T1 = repmat(A',[length(A) 1]);
T2 = repmat(A,[1 length(A)]);
C = mat2cell(cell2mat([T1(:),T2(:)]),ones(length(T1(:)),1),2);

答案 3 :(得分:0)

您可以使用meshgrid通过展开a的两个矩阵输出来帮助在meshgrid中创建值对的唯一排列,以使它们适合N x 2矩阵。完成此操作后,您可以使用mat2cell确定最终结果,以创建2D单元阵列。换句话说:

a = {1;2;3};
[x,y] = meshgrid([a{:}], [a{:}]);
b = mat2cell([x(:) y(:)], ones(numel(a)*numel(a),1), 2);

b将包含您的2D单元格数组。要查看每一步发生了什么,这就是第二行的输出结果。 xy实际上是2D矩阵,但是我要展开它们并将它们显示在矩阵中,我将它们连接在一起:

>> disp([x(:) y(:)])

 1     1
 1     2
 1     3
 2     1
 2     2
 2     3
 3     1
 3     2
 3     3

将两个向量连接在一起成为2D矩阵对于下一行代码非常重要。这是实现您想要的目标的关键步骤。在第二行代码之后,目标是使这个连接矩阵的每个元素成为单元格数组中的单个单元格,这是mat2cell最终正在做的事情。通过运行最后一行代码,然后显示b的内容,这就是我们得到的结果:

>> format compact;
>> celldisp(b)

b{1} =
     1     1
b{2} =
     1     2
b{3} =
     1     3
b{4} =
     2     1
b{5} =
     2     2
b{6} =
     2     3
b{7} =
     3     1
b{8} =
     3     2
b{9} =
     3     3

b将是一个9元素的单元格数组,在每个单元格中是另一个1 x 2的单元格数组,它将一行连接矩阵存储为单个单元格。