生成无重复的组合(排列)矩阵(数组超过最大数组大小偏好)

Generate a matrix of combinations (permutation) without repetition (array exceeds maximum array size preference)

我正在尝试生成一个矩阵,它具有 [0 0 1 1] 的所有唯一组合,我为此编写了这段代码:

v1 = [0 0 1 1];
M1 = unique(perms([0 0 1 1]),'rows');

• 这并不理想,因为 perms() 认为每个向量元素都是唯一的,并且在做:

4! = 4 * 3 * 2 * 1 = 24 组合。

• 使用 unique() 我试图删除所有重复的条目所以我最终得到组合矩阵 M1 →

只有 [4!/ 2! * (4-2)!] = 6 个组合!

现在,当我尝试做一些非常简单的事情时:

n = 15;
i = 1;
v1 = [zeros(1,n-i) ones(1,i)];
M = unique(perms(vec_1),'rows');

perms() 函数尝试执行

而不是获取 [15!/ 1! * (15-1)!] = 15 组合

15! = 1.3077e+12 组合,它被打断了。

• 您将如何着手做得更好?提前致谢!

你可以使用 nchoosek 到 return 应该是 1 的指标,我想你心里知道这一定是可能的,因为你使用的是 [= 的定义12=] 来确定预期的最终排列数!所以我们可以使用:

idx = nchoosek( 1:N, k );

其中 N 是数组 v1 中的元素数,k 是值为 1 的元素数。然后这只是创建 zeros 数组并填充数组的一个例子。

v1 = [0, 0, 1, 1];
N = numel(v1); % number of elements in array
k = nnz(v1);   % number of non-zero elements in array

colidx = nchoosek( 1:N, k );                  % column index for ones
rowidx = repmat( 1:size(colidx,1), k, 1 ).';  % row index for ones

M = zeros( size(colidx,1), N ); % create output
M( rowidx(:) + size(M,1) * (colidx(:)-1) ) = 1;

这适用于您的两个示例,无需巨大的中间矩阵。


旁白:由于您使用这种方法获得了指标,因此您可以创建一个 sparse 矩阵,但这是否是一个好主意取决于您在这一点之后所做的事情。