固有ベクトルの向き

3 visualizzazioni (ultimi 30 giorni)
Kohei Nishizawa
Kohei Nishizawa il 26 Set 2022
Commentato: Kohei Nishizawa il 29 Set 2022
固有ベクトルを算出するときにベクトルの符号を指定することは可能でしょうか?
  4 Commenti
Hernia Baby
Hernia Baby il 26 Set 2022
Modificato: Hernia Baby il 27 Set 2022
※修正:日本語がおかしかったので書き直しました
----------
可能です。
どのように指定するかで回答を考えたいので、具体的な内容をお聞きしたいです。
その前に、まずはシンプルな例で検証をしてみましょう。
X = [-1,1,2];
Xi = MyEigVec(X)
Xi = 1×3
1 -1 -2
function y = MyEigVec(x)
if x(1) < 0
y = - x;
else
y = x;
end
end
Kohei Nishizawa
Kohei Nishizawa il 27 Set 2022
ご丁寧にありがとうございます。
以下Aは[V, D] = eig(a)で算出された固有ベクトルになるのですが、3次元配列の3番目と4番目の固有ベクトルの符号を1番目と2番目に合わせて同じ向きの座標系にしたいと考えています。ご教示いただけますでしょうか。
A = [-0.0449 -0.5388 -0.8413; -0.6687 0.6418 -0.3754; 0.7422 0.5457 -0.3891]
A(:,:,2) = [-0.0453 -0.5361 -0.8429; -0.6897 0.6272 -0.3618; 0.7227 0.5649 -0.3982]
A(:,:,3) = [0.0464 0.5318 -0.8456; 0.7089 -0.6139 -0.3472;-0.7038 -0.5834 -0.4055]
A(:,:,4) = [0.0469 -0.5288 -0.8475; 0.7276 0.5994 -0.3337;-0.6844 0.6010 -0.4128]

Accedi per commentare.

Risposta accettata

Hernia Baby
Hernia Baby il 27 Set 2022
各列ベクトルの符号が必ず対応しているものとして話を進めます
今回は符号関数signを使います
まずは準備
clc,clear
A = [-0.0449 -0.5388 -0.8413; -0.6687 0.6418 -0.3754; 0.7422 0.5457 -0.3891];
A(:,:,2) = [-0.0453 -0.5361 -0.8429; -0.6897 0.6272 -0.3618; 0.7227 0.5649 -0.3982];
A(:,:,3) = [0.0464 0.5318 -0.8456; 0.7089 -0.6139 -0.3472;-0.7038 -0.5834 -0.4055];
A(:,:,4) = [0.0469 -0.5288 -0.8475; 0.7276 0.5994 -0.3337;-0.6844 0.6010 -0.4128];
ここでAの符号を算出します
Sgn_A = sign(A)
Sgn_A =
Sgn_A(:,:,1) = -1 -1 -1 -1 1 -1 1 1 -1 Sgn_A(:,:,2) = -1 -1 -1 -1 1 -1 1 1 -1 Sgn_A(:,:,3) = 1 1 -1 1 -1 -1 -1 -1 -1 Sgn_A(:,:,4) = 1 -1 -1 1 1 -1 -1 1 -1
すべて1の行列を作成し、3番目と4番目の符号を1番目と2番目のものとかけることで反転すべきか決めます
idx = ones(size(A));
for ii = 1:size(A,3)/2
idx(:,:,ii+2) = Sgn_A(:,:,ii).*Sgn_A(:,:,ii+2);
end
B = A.*idx;
Bの符号を見てみましょう
sign(B)
ans =
ans(:,:,1) = -1 -1 -1 -1 1 -1 1 1 -1 ans(:,:,2) = -1 -1 -1 -1 1 -1 1 1 -1 ans(:,:,3) = -1 -1 -1 -1 1 -1 1 1 -1 ans(:,:,4) = -1 -1 -1 -1 1 -1 1 1 -1
1,2番目と対応していることがわかりました

Più risposte (1)

Kohei Nishizawa
Kohei Nishizawa il 28 Set 2022
ありがとうございます。非常に参考になります。 ちなみに1番目、2番目と3番目、4番目の各列ベクトルの向きを合わせるという条件ですと他に方法は考えられますでしょうか?
  6 Commenti
Hernia Baby
Hernia Baby il 29 Set 2022
すみません、少し教えてください。
「ベクトルの方向が変わっていない」というのは、どこを指しますか?
B = [-0.0412 -0.7211 -0.6916; -0.0365 0.6928 -0.7202; 0.9985 -0.0045 -0.0549];
B(:,:,2) = [-0.0417 -0.7310 -0.6811; -0.0515 0.6823 -0.7292; 0.9978 0.0046 -0.0661]
B =
B(:,:,1) = -0.0412 -0.7211 -0.6916 -0.0365 0.6928 -0.7202 0.9985 -0.0045 -0.0549 B(:,:,2) = -0.0417 -0.7310 -0.6811 -0.0515 0.6823 -0.7292 0.9978 0.0046 -0.0661
上記ですと1と2の各列ベクトルは異なるように思えます。
Kohei Nishizawa
Kohei Nishizawa il 29 Set 2022
言葉が混同してすみません。Aの行列に関しては3次元配列の1番目を基準にして符号を揃えることで「反転」してしまった固有ベクトルを修正するプログラムを検討していただきました。連続的に処理をしていく中で例外的にBのような符号は変わっているが「反転」していないベクトルが出てきた場合、符号修正の処理を実行しない方法などがありましたら教えていただければと思い質問させていただきました。例えばCの1番目の固有ベクトルを基準にして2-6番目の固有ベクトルを反転しないように修正していく場合になります。
A = [-0.0449 -0.5388 -0.8413; -0.6687 0.6418 -0.3754; 0.7422 0.5457 -0.3891];
A(:,:,2) = [-0.0453 -0.5361 -0.8429; -0.6897 0.6272 -0.3618; 0.7227 0.5649 -0.3982];
A(:,:,3) = [0.0464 0.5318 -0.8456; 0.7089 -0.6139 -0.3472;-0.7038 -0.5834 -0.4055];
A(:,:,4) = [0.0469 -0.5288 -0.8475; 0.7276 0.5994 -0.3337;-0.6844 0.6010 -0.4128];
B = [-0.0412 -0.7211 -0.6916; -0.0365 0.6928 -0.7202; 0.9985 -0.0045 -0.0549];
B(:,:,2) = [-0.0417 -0.7310 -0.6811; -0.0515 0.6823 -0.7292; 0.9978 0.0046 -0.0661];
C = cat(3,A,B)
C =
C(:,:,1) = -0.0449 -0.5388 -0.8413 -0.6687 0.6418 -0.3754 0.7422 0.5457 -0.3891 C(:,:,2) = -0.0453 -0.5361 -0.8429 -0.6897 0.6272 -0.3618 0.7227 0.5649 -0.3982 C(:,:,3) = 0.0464 0.5318 -0.8456 0.7089 -0.6139 -0.3472 -0.7038 -0.5834 -0.4055 C(:,:,4) = 0.0469 -0.5288 -0.8475 0.7276 0.5994 -0.3337 -0.6844 0.6010 -0.4128 C(:,:,5) = -0.0412 -0.7211 -0.6916 -0.0365 0.6928 -0.7202 0.9985 -0.0045 -0.0549 C(:,:,6) = -0.0417 -0.7310 -0.6811 -0.0515 0.6823 -0.7292 0.9978 0.0046 -0.0661

Accedi per commentare.

Categorie

Scopri di più su 線形代数 in Help Center e File Exchange

Prodotti


Release

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!