我想知道如何在MATLAB中做到这一点。
我有a={1;2;3}
并想创建一个单元格数组
{{1,1};{1,2};{1,3};{2,1};{2,2};{2,3};{3,1};{3,2};{3,3}}.
如果没有for循环,我怎么能这样做?
答案 0 :(得分:1)
您可以使用allcomb
from MATLAB File-exchange来帮助您 -
mat2cell(allcomb(a,a),ones(1,numel(a)^2),2)
答案 1 :(得分:1)
只是为了好玩,使用kron
和repmat
:
a = {1;2;3}
b = mat2cell([kron(cell2mat(a),ones(numel(a),1)) repmat(cell2mat(a),numel(a),1)])
此处方括号[]用于执行两个列向量的concatenation,其中每个向量都由kron
或repmat
定义。
这很容易推广,但我怀疑这是最有效/最快的解决方案。
答案 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单元格数组。要查看每一步发生了什么,这就是第二行的输出结果。 x
和y
实际上是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
的单元格数组,它将一行连接矩阵存储为单个单元格。