如何在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来保存内存。如果语法符合您的要求,请考虑将此答案标记为“接受”…我恐怕无法神奇地减少如此大规模计算所需的内存,正如路易斯诺特所述,在八度音阶中,您可以直接将字母表指定为向量,从而将脚本缩短一步。请注意,在八度音阶中,您可以将字母表直接指定为向量,从而将脚本缩短一步。