固有ベクトルの向き

11 Ansichten (letzte 30 Tage)
Kohei Nishizawa
Kohei Nishizawa am 26 Sep. 2022
Kommentiert: Kohei Nishizawa am 29 Sep. 2022
固有ベクトルを算出するときにベクトルの符号を指定することは可能でしょうか?
  4 Kommentare
Hernia Baby
Hernia Baby am 26 Sep. 2022
Bearbeitet: Hernia Baby am 27 Sep. 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 am 27 Sep. 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]

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Hernia Baby
Hernia Baby am 27 Sep. 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番目と対応していることがわかりました

Weitere Antworten (1)

Kohei Nishizawa
Kohei Nishizawa am 28 Sep. 2022
ありがとうございます。非常に参考になります。 ちなみに1番目、2番目と3番目、4番目の各列ベクトルの向きを合わせるという条件ですと他に方法は考えられますでしょうか?
  6 Kommentare
Hernia Baby
Hernia Baby am 29 Sep. 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 am 29 Sep. 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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Logical finden Sie in Help Center und File Exchange

Produkte


Version

R2022a

Community Treasure Hunt

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

Start Hunting!