Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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_Matrix_Combinations - Fatal编程技术网

如何在MATLAB中为矩阵的列向量生成所有可能的组合?

如何在MATLAB中为矩阵的列向量生成所有可能的组合?,matlab,matrix,combinations,Matlab,Matrix,Combinations,如果B=[1;2]和A=[B B…(n次B)],如何获得A列向量之间所有可能组合对应的矩阵C。我想得到相同向量的n个拷贝之间的组合 例如,对于n=3: A = 1 1 1 2 2 2 因此,C可以使用文件交换“allcomb(varargin)”中的函数获得: 在我的例子中,n是可变的。如何获得任意n值的C,您可以将重复放在单元格中,并使用{:}语法将所有单元格元素作为 输出: C = 1 1 1 1 1

如果
B=[1;2]
A=[B B…(n次B)]
,如何获得
A
列向量之间所有可能组合对应的矩阵
C
。我想得到相同向量的n个拷贝之间的组合

例如,对于n=3:

A =
     1     1     1
     2     2     2
因此,
C
可以使用文件交换“allcomb(varargin)”中的函数获得:


在我的例子中,n是可变的。如何获得任意n值的
C

您可以将重复放在单元格中,并使用
{:}
语法将所有单元格元素作为

输出:

C =
 1     1     1
 1     1     2
 1     2     1
 1     2     2
 2     1     1
 2     1     2
 2     2     1
 2     2     2

您可以将重复放在单元格中,并使用
{:}
语法将所有单元格元素作为输入放在单元格中

输出:

C =
 1     1     1
 1     1     2
 1     2     1
 1     2     2
 2     1     1
 2     1     2
 2     2     1
 2     2     2
有趣的是,从MATLAB文件交换似乎是你想要的

allcomb([1; 2],[1; 2], [1; 2])

ans =

     1     1     1
     1     1     2
     1     2     1
     1     2     2
     2     1     1
     2     1     2
     2     2     1
     2     2     2

要对任何
n
执行此操作,只需使用以下内容构造矩阵:

>> n = 3;
>> repmat(B, 1, n)

ans =

     1     1     1
     2     2     2
有趣的是,从MATLAB文件交换似乎是你想要的

allcomb([1; 2],[1; 2], [1; 2])

ans =

     1     1     1
     1     1     2
     1     2     1
     1     2     2
     2     1     1
     2     1     2
     2     2     1
     2     2     2

要对任何
n
执行此操作,只需使用以下内容构造矩阵:

>> n = 3;
>> repmat(B, 1, n)

ans =

     1     1     1
     2     2     2

因为每个位置的字母表都是相同的,所以这实际上是一个基本转换。MATLAB只接受整数基,但我们可以使用该整数作为字母表
B
的索引:

B=[1; 2];
n = 3;
b = numel(B);

for k = 0:(b^n-1)   % loop over all possible combinations
   C(k+1,:) = dec2base(k, b, n);
end
C = C - '0' + 1;   % convert 0..b-1 (in chars) into 1..b (in ints) for indexing
C = B(C);          % index into alphabet B
结果:

>> C
C =

   1   1   1
   1   1   2
   1   2   1
   1   2   2
   2   1   1
   2   1   2
   2   2   1
   2   2   2
在本例中,脚本的最后一行似乎没有多大作用,因为字母表恰好与索引的范围相同,但将字母表更改为
B=[7;14]
将正确地导致:

C =

    7    7    7
    7    7   14
    7   14    7
    7   14   14
   14    7    7
   14    7   14
   14   14    7
   14   14   14

因为每个位置的字母表都是相同的,所以这实际上是一个基本转换。MATLAB只接受整数基,但我们可以使用该整数作为字母表
B
的索引:

B=[1; 2];
n = 3;
b = numel(B);

for k = 0:(b^n-1)   % loop over all possible combinations
   C(k+1,:) = dec2base(k, b, n);
end
C = C - '0' + 1;   % convert 0..b-1 (in chars) into 1..b (in ints) for indexing
C = B(C);          % index into alphabet B
结果:

>> C
C =

   1   1   1
   1   1   2
   1   2   1
   1   2   2
   2   1   1
   2   1   2
   2   2   1
   2   2   2
在本例中,脚本的最后一行似乎没有多大作用,因为字母表恰好与索引的范围相同,但将字母表更改为
B=[7;14]
将正确地导致:

C =

    7    7    7
    7    7   14
    7   14    7
    7   14   14
   14    7    7
   14    7   14
   14   14    7
   14   14   14


allcomb
不是内置函数,它来自文件交换:。你应该在问题中提到这一点。重复?@Luis我也这么认为,我不认为每个输入向量都相同的细微差别使这个问题特别新颖…@Wolfie我最初标记为dupe,但是没有标记,因为这里真正的问题可能是生成一个逗号分隔的列表,其中包含输入向量的
n
副本
B
allcomb
不是一个内置函数,它来自文件交换:。你应该在问题中提到这一点。重复?@Luis我也这么认为,我不认为每个输入向量都相同的细微差别使这个问题特别新颖…@Wolfie我最初标记为dupe,但是没有标记,因为这里真正的问题可能是生成输入向量
n
副本的逗号分隔列表
B
OP在他们的问题中使用了这个函数,您没有在这个答案中添加任何功能。。。他们希望避免重复输入
[1;2]
,并重复
n
次,就像我的回答一样。@mlg556不幸的是,我有一个长的B向量(长度(B)=100),我问题中的示例仅用于说明。'在这种情况下,repmat'似乎只适用于有限的n值。OP在他们的问题中使用了此函数,您还没有在这个答案中添加任何功能。。。他们希望避免重复输入
[1;2]
,并重复
n
次,就像我的回答一样。@mlg556不幸的是,我有一个长的B向量(长度(B)=100),我问题中的示例仅用于说明。'在这种情况下,repmat'似乎只对有限的n值有效。谢谢你的回答,@Wolfie。它实际上是有效的,但只适用于有限的n值,因为我使用的B向量的长度是100。还有其他解决方案吗?@Ghani会生成一个
100^n
×
n
矩阵,因此随着
n
的增加,内存会很快用完。如果这是问题所在,你也无能为力。如果可能的话,可以使用<代码> UTI88/COD>数据类型,但它仅通过“<代码> 8”/代码> Ghani来保存内存。如果语法符合您的要求,请考虑将此答案标记为“接受”…“我恐怕无法神奇地减少这么大的计算所需的内存,正如路易斯·汉克·尤为你的答案所概述的那样,@Wolfie。”。它实际上是有效的,但只适用于有限的n值,因为我使用的B向量的长度是100。还有其他解决方案吗?@Ghani会生成一个
100^n
×
n
矩阵,因此随着
n
的增加,内存会很快用完。如果这是问题所在,你也无能为力。如果可能的话,可以使用<代码> UTI88/COD>数据类型,但它仅通过“<代码> 8”/代码> Ghani来保存内存。如果语法符合您的要求,请考虑将此答案标记为“接受”…我恐怕无法神奇地减少如此大规模计算所需的内存,正如路易斯诺特所述,在八度音阶中,您可以直接将字母表指定为向量,从而将脚本缩短一步。请注意,在八度音阶中,您可以将字母表直接指定为向量,从而将脚本缩短一步。