You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效生成含重复元素数组的无重复排列矩阵 避免超数组大小限制

高效生成指定数量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:06:04