10

次の問題があります。セットの順列を計算する必要があります。ただし、セットには同じ2つの要素が含まれている可能性があるため、順列が繰り返されます。例えば:

セットが与えられると[ 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 ( )によるファイルです。別の方法として、 Ged Ridgeway によるuniqueperms別の FEX 提出があります。どちらが速いかを確認するには、少しプロファイリングする必要があります。

Matlab の JIT の制限により、非組み込み関数を呼び出す場合、ループは高速化されないことに注意してください。そのため、ループ内でこれらの関数の内容をコピーして貼り付ける (および/またはそれらを少し特殊化する) と有益な場合があります。 )。

于 2012-10-28T16:45:01.043 に答える