2012-10-28 21 views
10

私は以下の問題があります。私はセットの順列を計算する必要があります。しかしながら、セットは同じである2つの要素を含むことができ、したがって繰り返しの順列を引き起こす。たとえば:一意の置換を効率的に見つける

1  2  0  0 
1  2  0  0 

しかし、私はこのような同一の順列を避けたい:セット[ 0 0 1 2 ]考える

は、順列は、これらの可能性があります。

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

をしかし、ここでの問題は効率である - 私は巨大なforループで繰り返し、これをやっているとuniqueで必要なソートは遅すぎる:MATLABで私は単にこれを行うことができます。だから私の質問です:私はこの性質のユニークな順列を計算することができます後で結果をループすることなく?私はMATLABで作業していますが、MATLABでベクトル化できるものはおそらく理想的ですが、一般的な解決策はおそらく役に立つでしょう。

私が知る限り、既存の質問はこの問題を正確にはカバーしていませんが、これが以前に回答されていれば謝ります。

+0

あなたは本当に解決しようとしている問題は何ですか?なぜあなたは高速で異なる配列の順列を見つける必要があるループを持っていますか? – nibot

+0

良い点、おそらく私はより具体的であったはずですが、ちょっと面倒です。私は、オブジェクトがそれらに関連付けられたクラスを持っていますが、イメージ間のオブジェクトの対応するセットの方法を探しています。私は集合Aから一度に5つのオブジェクトを取り出し、集合Bのオブジェクトに対応するすべての方法を見つけます。各クラス内で順列を見つけることによってクラスの制約に取り組みます。これは、ゼロがある理由です。それらは、ペアになっていないオブジェクトを表しています。そのため、このような順列を繰り返すことは望ましくありません。 – jazzbassrob

答えて

3

これは定期的に発生する問題です。 Hereは、かなり効果的に取り組んでいると思われるJohn d'Errico(uniqueperms)のファイルです。代わりに、Ged Ridgwayの別のFEX提出hereがあります。どちらが速いのかを少し調べる必要があります。

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

+0

ああ、ありがとう、ありがとう!私のグーグルの能力は明らかに練習を必要とします! – jazzbassrob

関連する問題