Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 枚举单元格的组合_Matlab_Combinations_Cell Array - Fatal编程技术网

Matlab 枚举单元格的组合

Matlab 枚举单元格的组合,matlab,combinations,cell-array,Matlab,Combinations,Cell Array,假设我有3个单元格: M1={ [1,1,1], [2,2,2] } M2={ [3,3], [4,4] } M3={ [5], [6] } 我想取M1中的每个元素,把它和M2的每个元素结合起来,把它和M3的每个元素结合起来,等等 对于上述输入,我想制作一个巨细胞,如: [1,1,1],[3,3],[5] [1,1,1],[3,3],[6] [1,1,1],[4,4],[5] [1,1,1],[4,4],[6] [2,2,2],[3,3],[5] [2,2,2],[3,3],[6] [2,2,

假设我有3个单元格:

M1={ [1,1,1], [2,2,2] }
M2={ [3,3], [4,4] }
M3={ [5], [6] }
我想取M1中的每个元素,把它和M2的每个元素结合起来,把它和M3的每个元素结合起来,等等

对于上述输入,我想制作一个巨细胞,如:

[1,1,1],[3,3],[5]
[1,1,1],[3,3],[6]
[1,1,1],[4,4],[5]
[1,1,1],[4,4],[6]
[2,2,2],[3,3],[5]
[2,2,2],[3,3],[6]
[2,2,2],[4,4],[5]
[2,2,2],[4,4],[6]

我该怎么做?通常情况下,单元格M1、M2…Mn的数量及其大小未知且不断变化。

此函数满足您的要求:

function C = add_permutations(A,B)
% A is a cell array NxK, B is 1xM
% C is a cell array N*M x K+1
N = size(A,1);
A = reshape(A,N,1,[]);
C = cat(3,repmat(A,1,numel(B)),repmat(B,N,1));
C = reshape(C,[],size(C,3));
它通过在不同维度中复制两个单元阵列,然后沿第三维连接并折叠前两个维度,来创建两个单元阵列的所有组合。因为我们想用不同的单元数组重复调用它,所以输入一个NxK,每行有K个矩阵,这些是前面的组合。B是一个单元向量,每个元素将与a的每一行相结合

您可以按如下方式使用它:

M1 = { 'a', 'b', 'c', 'd' }; % These are easier for debugging than OP's input, but cell elements can be anything at all.
M2 = { 1, 2 };
M3 = { 10, 12 };

X = M1.';
X = add_permutations(X,M2);
X = add_permutations(X,M3);
X现在包含:

X =

  16×3 cell array

    'a'    [1]    [10]
    'b'    [1]    [10]
    'c'    [1]    [10]
    'd'    [1]    [10]
    'a'    [2]    [10]
    'b'    [2]    [10]
    'c'    [2]    [10]
    'd'    [2]    [10]
    'a'    [1]    [12]
    'b'    [1]    [12]
    'c'    [1]    [12]
    'd'    [1]    [12]
    'a'    [2]    [12]
    'b'    [2]    [12]
    'c'    [2]    [12]
    'd'    [2]    [12]

这不是一个排列,而是一个枚举:你有3个符号,每个符号有2个可能的值,你只是在枚举所有可能的数字。你可以用3位数的二进制数来思考这个问题

在这种情况下,列举所有这些可能性的一种方法是使用。如果M1有n1个元素,M2有n2个元素,等等:

n1 = numel(M1);
n2 = numel(M2);
n3 = numel(M3);

[a,b,c] = ndgrid(1:n1, 1:n2, 1:n3);
这里a、b、c是每个三维数组,它们表示组合的网格。很明显,你们不需要它,所以你们可以把它们矢量化,然后用它们来创建M1,M2,M3中各种元素的组合,就像这样

如果您有兴趣将其推广到任意数量的Ms,也可以这样做,但请记住,随着维数的增加,这些网格的增长速度非常快


注意:表示垂直连接,之所以是垂直连接而不是水平连接,是因为M1a:的结果是一个行形单元格,即使a:是一个列向量。这只是索引问题,但如果需要Nx3,您可以简单地转置结果。

您是否尝试过对其进行编码?如果单元数未知,并且可能是无限的,则由于实际原因,例如没有足够的RAM来执行计算,可能无法解决此问题。您可以使用with vectors={M1 M2 M3}@Frank
vertcat( M1(a(:)), M2(b(:)), M3(c(:)) )