【问题标题】:Generate a matrix of combinations (permutation) without repetition (array exceeds maximum array size preference)生成不重复的组合(排列)矩阵(数组超过最大数组大小首选项)
【发布时间】:2021-12-10 22:22:28
【问题描述】:

我正在尝试生成一个矩阵,它具有 [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 组合并被中断。

• 您将如何以更好的方式做事?提前致谢!

【问题讨论】:

  • 是的,确实如此。首先 perms 在调用 unique 之前需要 yo 输出,因此您的代码无法解决内存问题。
  • 感谢您的评论。你会建议做什么?有没有办法在不耗尽内存的情况下生成这些组合?
  • 我假设自己编写代码。不确定是否有内置
  • 我不知道该怎么做,我知道它周围的数学以及如何用二项式系数计算组合的度数,但函数 perms 的工作原理并不明显

标签: arrays matlab matrix permutation


【解决方案1】:

您可以使用nchoosek 来返回应该是1 的索引,我想您心里知道这一定是可能的,因为您使用nchoosek 的定义来确定预期的最终排列数!所以我们可以使用:

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.09 秒,非常感谢!我正在做一个汉明码项目,我需要想出一个想法来生成错误矩阵。所以这工作得很好!我之前也在代码中使用了 nchoosek()
  • @johnny_1010 最后一行使用linear indexing 填充rowidxcolidx 指定的矩阵条目
猜你喜欢
  • 2021-06-08
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2018-11-12
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多