10

我有以下问题。我需要计算一个集合的排列;但是,该集合可能包含两个相同的元素,因此会导致重复排列。例如:

给定 set [ 0 0 1 2 ],排列包括以下可能性:

 1     2     0     0
 1     2     0     0

但是,我想避免像这样的相同排列。在 MATLAB 中,我可以简单地做到这一点:

unique(perms([ 0 0 1 2 ]), 'rows')

但这里的问题是效率 - 我在一个巨大的for循环中重复这样做,并且所需的排序unique太慢了。所以我的问题是:我可以直接计算这种性质的独特排列,而不必事后遍历结果吗?我在 MATLAB 中工作,但只是一个通用的解决方案可能会有所帮助,尽管可以在 MATLAB 中矢量化的东西可能是理想的!

据我所知,现有问题并没有完全涵盖这个问题,但如果之前已经回答过这个问题,我们深表歉意。

4

1 回答 1

3

这似乎是一个经常发生的问题。是 John d'Errico ( uniqueperms) 的一个文件,它似乎可以非常有效地解决它。作为替代方案,Ged Ridgway在这里提交了另一个 FEX;你必须稍微分析一下,看看哪个更快。

请注意,由于 Matlab 的 JIT 的限制,如果循环调用非内置函数,则不会加速循环,因此在循环中复制粘贴这些函数的内容(和/或稍微专门化它们)可能是有益的(s )。

于 2012-10-28T16:45:01.043 回答