2012-10-28 45 views
10

我有以下问题。我需要计算一个集合的排列;然而,该组可能包含两个相同的元素,因此会导致重复的排列。例如:有效地找到独特的排列

鉴于集[ 0 0 1 2 ],所述排列包括这些可能性:

1  2  0  0 
1  2  0  0 

然而,我想避免相同的排列如这些。在MATLAB中我可以简单地这样做:

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

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

据我可以看到现有的问题并没有涵盖这个问题,但道歉,如果这已被回答之前。

+0

你真的想解决什么问题?为什么你有一个循环,你需要找到高速不同阵列的排列? – nibot

+0

好点,也许我应该是更具体的,虽然它有点混乱。我正在寻找图像之间相应对象集的方法,尽管对象有一个与它们相关的类。我从集合A中抽出5个对象,并找到将它们对应到集合B中的对象的所有方法。我通过查找每个类中的排列来解决类限制。这就是为什么有零:它们表示一个对象不与另一个对齐,这就是为什么我不想重复这样的排列。 – jazzbassrob

回答

3

它会出现这是一个经常发生的问题。 Here是John d'Errico(uniqueperms)的一个文件,似乎很有效地解决了这个问题。作为替代方案,Ged Ridgway还有另外一个FEX提交here;你必须简要介绍一下哪一个更快。

请注意,由于Matlab的JIT的限制,如果调用非内建函数,则循环不会加速,所以将这些函数的内容(和/或专用它们)复制粘贴到内部可能会有好处你的循环(s)。

+0

就是这样,非常感谢!我的谷歌搜索功能显然需要练习! – jazzbassrob