如何高效生成含重复元素数组的无重复排列矩阵 避免超数组大小限制
高效生成指定数量0、1构成的唯一排列矩阵的MATLAB方案
核心逻辑:你需要的所有唯一排列本质是从n个位置中选出i个放置1、其余位置放置0的组合,完全不需要生成全量排列后去重,直接基于组合索引生成即可,时间和空间复杂度仅与有效排列数$C_n^i$成正比,不会出现阶乘级别的资源占用。
通用实现代码
% 自定义参数:n为向量总长度,i为向量中1的个数 n = 15; i = 1; % 生成所有i个位置的组合索引 pos = nchoosek(1:n, i); row_num = size(pos, 1); % 初始化结果矩阵为全0 M = zeros(row_num, n); % 逐行给对应位置赋值为1 for k = 1:row_num M(k, pos(k,:)) = 1; end
效果说明
- 当
n=4、i=2时,运行后得到的M为6行4列矩阵,和unique(perms([0 0 1 1]),'rows')的输出结果完全一致 - 当
n=15、i=1时,运行后直接得到15行15列的目标矩阵,无任何性能压力 - 即便是
n=30、i=10这类需要生成3000万+行的场景,也能正常运行,不会触发内存超限
向量化优化版本(可选,无需循环)
% 自定义参数:n为向量总长度,i为向量中1的个数 n = 15; i = 1; pos = nchoosek(1:n, i); row_num = size(pos, 1); M = zeros(row_num, n); % 用sub2ind批量赋值 M(sub2ind(size(M), repmat((1:row_num)',1,i), pos)) = 1;
如果需要处理包含3种及以上重复值的通用唯一排列场景,可以使用MATLAB生态的uniqueperms工具,无需依赖全排列去重逻辑。
内容的提问来源于stack exchange,提问作者johnny_1010
相关产品推荐
相关产品推荐

