固有値による固有ベクトルのソーティング(関連するソート)
-
30-09-2019 - |
質問
固有値の非オルティングベクトルと、固有ベクトルの関連するマトリックスがあります。固有値のソートされたセットに関して、マトリックスの列を並べ替えたいと思います。 (例、固有値[3]が固有値[2]に移動する場合、固有ベクトルマトリックスの列3に列2に移動することを望みます。)
固有値を並べ替えることができることを知っています O(N log N)
経由 std::sort
. 。独自のソートアルゴリズムを転がさずに、マトリックスの列(関連する固有ベクトル)が固有値を並べて並べ替えていることを確認するにはどうすればよいですか?
解決
通常、このような構造を作成するだけです。
struct eigen {
int value;
double *vector;
bool operator<(eigen const &other) const {
return value < other.value;
}
};
または、固有値/固有ベクトルをにするだけです std::pair
- 私は好むが eigen.value
と eigen.vector
以上 something.first
と something.second
.
他のヒント
私はこれをさまざまな状況で何度も行ってきました。配列をソートするのではなく、ソートされたインデックスがある新しい配列を作成するだけです。
たとえば、長さのn配列(ベクトル)エヴァルがあり、2D NXNアレイが誘発されます。値[0、n-1]を含む新しい配列インデックスを作成します。
次に、EVALS [i]としてエヴァルにアクセスするのではなく、eVALS [index [i]]としてアクセスし、[i] [j]を誘導する代わりに、[index [i]] [j]にアクセスします。
これで、sortルーチンを記述してEvalsアレイではなくインデックス配列をソートするため、{0、1、2、...、n-1}のように見えるインデックスの代わりに、インデックスアレイの値は順序で増加しますEvalsアレイの値の。
したがって、ソート後、これを行う場合:
for (int i=0;i<n;++i)
{
cout << evals[index[i]] << endl;
}
エバルのソートリストが表示されます。
このようにして、実際にメモリを動かすことなく、アレイを回避することに関連するものをすべて並べ替えることができます。これは、nが大きくなった場合に重要です。EvectsMatrixの列を動き回りたくありません。
基本的に、I'thestest evalはインデックス[i]に配置され、それはインデックス[i] th evectに対応します。
追加するために編集。これが私がSTD ::私が言ったことをするためにSTD ::ソートを使用するために書いたソート関数です:
template <class DataType, class IndexType>
class SortIndicesInc
{
protected:
DataType* mData;
public:
SortIndicesInc(DataType* Data) : mData(Data) {}
Bool operator()(const IndexType& i, const IndexType& j) const
{
return mData[i]<mData[j];
}
};
ソリューションは、固有ベクトルマトリックスを保存する方法に純粋に依存しています。
並べ替え中の最高のパフォーマンスは、実装できれば達成されます swap(evector1, evector2)
そのため、ポインターのみを象徴し、実際のデータは変更されません。
これは、ようなものを使用して行うことができます double*
または、おそらくもっと複雑なものは、マトリックスの実装に依存します。
この方法で完了した場合、 swap(...)
ソート操作のパフォーマンスには影響しません。
ベクターとマトリックスをコングロマリットするという考えは、おそらくC ++でそれを行うための最良の方法です。私はRでそれをどのように行うかを考えており、それがC ++に翻訳できるかどうかを確認しています。 Rでは、非常に簡単です。残念ながら、C ++でOrder()操作を実行するための構築された方法を知りません。おそらく他の誰かがそうするでしょう。その場合、これは同様の方法で行うことができます。