生成无重复的组合(排列)矩阵(数组超过最大数组大小偏好)
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
矩阵,但这是否是一个好主意取决于您在这一点之后所做的事情。
我正在尝试生成一个矩阵,它具有 [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
矩阵,但这是否是一个好主意取决于您在这一点之后所做的事情。