を注文するので、私はすべてのTIのための固有値を取得するM[i][j][t]
を持っても、時間t = 1,....,N
の関数である長さ×L行列M[i][j]
の固有値を見つけるために、GSLライブラリからgsl_eigen_nonsymmおよび/またはgsl_eigen_symm L x L行列E[i][j] = M[i][j][t]
を割り当て、すべてのtに対して対角化する。GSLの固有値は、私は関数を使用しています
問題は、プログラムがいくつかの繰り返しの後で異なる順序で固有値を与えることです。私は対角化しようとしたときの固有値は常にl1 = -1.3 t , l2 = -t , l3 = 2.3 t
(approximatevly)になりますマトリックスM (t)) = {{0,t,t},{t,0,2t},{t,t,0}}
を考えてみます。t = 0
で私はt = 1
でeigen[t = 0] = {l1,l2,l3}(0)
を取得する場合、私は常に、より具体的に{l1,l2,l3}(t)
を持っている必要がありながら、例(L = 3)iについてeigen[t = 1] = {l3,l2,l1}(1)
を得ることができますそれは(以下のコードで)私は固有値の結果に数倍のスワップを得ました。それを防ぐ方法はありますか?私は大きさでそれらを並べ替えることはできません。私はいつも同じ順序(何でも)先験的にする必要があります。 (下のコードは私の問題を解明するための一例に過ぎません)
編集:先験的な私はその価値を知らないし、信頼性の高い構造のために毎回l1<l2<l3
のように統計的なゆらぎのため、アルゴリズムが常に同じように動作するようにする方法があるかどうかを知りたかったのは、固有値の順序が常に同じであるように、またはそれを実現するためのトリックがある場合です。
ここで私が提示したおもちゃの問題を再説明しようとします。私たちは時間に依存する行列を持っています。私はおそらく純粋にlambda_1(t).....lambda_N(t)
を得ると予想されていますが、アルゴリズムはしばしば異なる時刻に固有値を入れ替えることが多いので、例えばt = 1 I've got (lambda_1,lambda_2,lambda_3)(1) at time t = 2 (lambda_2,lambda_1,lambda_3)(2)
にあるとすれば、アルゴリズムが異なる時間に固有値を混ぜ合わせるので、時間がたつにつれて進化する。下のプログラムは、私の問題の分析的なおもちゃの例です。以下の行列の固有値はl1 = -1.3 t , l2 = -t , l3 = 2.3 t
ですが、プログラムは私に出力として与えるかもしれません。(-1.3,-1,2.3)(1), (-2,-2.6,4.6)(2), etc
先に述べたように、私はプログラムのオーダー固有値は実際の数値にもかかわらず常に同じ方法であるので、私は常に(l1、l2、l3)の組み合わせを得ます。私はそれがより明確であることを今願っています、そうでないか教えてください。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gsl/gsl_linalg.h>
#include <gsl/gsl_eigen.h>
#include <gsl/gsl_sort_vector.h>
main() {
int L = 3, i, j, t;
int N = 10;
double M[L][L][N];
gsl_matrix *E = gsl_matrix_alloc(L, L);
gsl_vector_complex *eigen = gsl_vector_complex_alloc(L);
gsl_eigen_nonsymm_workspace * w = gsl_eigen_nonsymm_alloc(L);
for(t = 1; t <= N; t++) {
M[0][0][t-1] = 0;
M[0][1][t-1] = t;
M[0][2][t-1] = t;
M[1][0][t-1] = t;
M[1][1][t-1] = 0;
M[1][2][t-1] = 2.0 * t;
M[2][1][t-1] = t;
M[2][0][t-1] = t;
M[2][2][t-1] = 0;
for(i = 0; i < L; i++) {
for(j = 0; j < L; j++) {
gsl_matrix_set(E, i, j, M[i][j][t - 1]);
}
}
gsl_eigen_nonsymm(E, eigen, w); /*diagonalize E which is M at t fixed*/
printf("#%d\n\n", t);
for(i = 0; i < L; i++) {
printf("%d\t%lf\n", i, GSL_REAL(gsl_vector_complex_get(eigen, i)))
}
printf("\n");
}
}
私はあなたがそれらを並べ替えることは望まないと分かりますが、gslにはソート機能もあります。私はあなたがすでにそれを知っていると思いますが、ただの場合... gsl_eigen_nonsymmv_sort –
固有値のための「先験的な順序付け」はありません。あなたのソートを妨げるものを詳しく教えてください。 – Phillip
私は質問を編集しましたが、基本的には、固有値が時々、その行動を「ランダムに」変化させるような統計的な変動のため、通常の方法で並べ替えることはできません。 – Fra