2016-10-02 9 views
0

私はMATLABのchangem()と等価である固有VectorXi、上の操作を実行するために必要としています:現時点では固有値:効率的なMATLABのchangem()と同等ですか?

http://www.mathworks.com/help/map/ref/changem.html

、私はこれをやっている方法は、配列の値をループさスイッチ/ケースブロックを用いて再マッピングを実行するステップとを含む。私はこれが特に効率的ではないと推測しています。

Eigenでこれを行うための速い方法がありますか?スピードは私のアプリケーションにとって非常に重要です。

答えて

1

スイッチ/ケースは特に低速で柔軟性がありません。

changemは行列と2つの値vector newとoldを取ります。エントリが古いリストにある場合は、新しいリストの対応するエントリに置き換えられます。したがって、本質的にはむしろ遅くなり、行列全体を渡し、古いリストを検索し、新しいリストと置き換えられた場合は、新しいリストに置き換える必要があります。 どのようにスピードアップできますか?まず、スイッチ/ケースとしてハードコードしないでください。現代のコンパイラはおそらく多くのジャンプではなくループに最適化されますが、私はそれを保証しません。そしてそのアプローチは柔軟性がありません。 第2に、「古い」ベクトルをソートし、線形のものではなくバイナリ検索を使用することができます。これは、古いベクトルが長い場合にのみ有意に役立ちます。 第3に、マトリックスについて知っていることを利用することができます。古い値は特定の地域に拘束されていますか?圧倒的に高い可能性があり、最初にテストできる1つの値がありますか?古いリストで許可されていない値をすばやく除外できますか(大きすぎる、小さすぎる、不可欠な)。

古い値は整数で、インデックスを使用できますか?それをハッシュに一般化する。バイナリ検索よりも高速ですが、ハッシュのオーバーヘッドが増えます。 問題を別の方法で解決し、行列xy座標のインデックスを値で保持できますか?

多くのアプローチがあります。しかし、最初のステップとしてC言語でMatlab関数を単純に実装してください。十分に速いかもしれません。

+0

ご意見ありがとうございます。可能な値は8つしかないので、これをルックアップテーブルとして実装しただけです(ただし、スワップを実行したいベクトルは数千の要素です)。つまり、スイッチ/ケースを取り除き、慎重に実装することで、現在は10倍高速になっています。 – NOP

関連する問題