行列をある1次元配列の順序をもとに並べ替えたい時の対処法

タイトルも何かイマイチ書きたいことを表現しきれていない気がするけど、例えば固有値問題を解いて、対角線上に固有値のある行列とそれに対応する固有ベクトルの行列を[V,Eg]=eig(H)で得ても、対角の固有値が昇順(あるいは降順)にソートされていなくって困った時に次のようにすればいいというメモ。改善の余地はあると思うけどとりあえず。

(1) 次のような関数を作る。戻り値が複数あるときは[]でくくるのかな?この場合はv1とdに帰ってくる。
% solve eigen-value problem and sort eigenvalue and vectors afterward
function [v1,d] = eigsort(x)
[v,d]   = eig (x);
[dd,ix] = sort (diag (d));
v1      = v(:,ix) ;
d=diag(sort (diag (d)));
endfunction

(2) 例えばヒュッケルとかで適当にハミルトニアンを作る。

H=[ 0 1 0 0; 1 0 1 0; 0 01 0 1; 0 0 1 0;]

(3) 先ほど(1)で定義した関数を使う。
[V, Eg] = eigsort(H);

 

追記1: 複素数の時は以下のように修正した。上はエルミート限定っぽい。”ascend”と”descend”で昇順降順を入れ替えれる。

%%%%%%%%%%%%%%
function [v1,d] = eigsort(x)
[v,d]   = eig (x);
[dd,ix] =  sort (diag(real(d)),’descend’  )
v1      = v(:, ix) ;
d=diag(sort (diag (real(d))));
endfunction

追記2:
追記1の最後の行を間違ってるかも。
d=diag(    sum(d(:,ix))’    )が正しいっぽい?

 

poissondd について

日々感じたことを書いていこうと思います。 テーマは分子エレクトロニクスから、MemristorのBehavioral modelまでいろいろ。
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中