固有ベクトルの向き

조회 수: 11 (최근 30일)
Kohei Nishizawa
Kohei Nishizawa 2022년 9월 26일
댓글: Kohei Nishizawa 2022년 9월 29일
固有ベクトルを算出するときにベクトルの符号を指定することは可能でしょうか?
  댓글 수: 4
Hernia Baby
Hernia Baby 2022년 9월 26일
편집: Hernia Baby 2022년 9월 27일
※修正:日本語がおかしかったので書き直しました
----------
可能です。
どのように指定するかで回答を考えたいので、具体的な内容をお聞きしたいです。
その前に、まずはシンプルな例で検証をしてみましょう。
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 2022년 9월 27일
ご丁寧にありがとうございます。
以下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]

댓글을 달려면 로그인하십시오.

채택된 답변

Hernia Baby
Hernia Baby 2022년 9월 27일
各列ベクトルの符号が必ず対応しているものとして話を進めます
今回は符号関数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番目と対応していることがわかりました

추가 답변 (1개)

Kohei Nishizawa
Kohei Nishizawa 2022년 9월 28일
ありがとうございます。非常に参考になります。 ちなみに1番目、2番目と3番目、4番目の各列ベクトルの向きを合わせるという条件ですと他に方法は考えられますでしょうか?
  댓글 수: 6
Hernia Baby
Hernia Baby 2022년 9월 29일
すみません、少し教えてください。
「ベクトルの方向が変わっていない」というのは、どこを指しますか?
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 2022년 9월 29일
言葉が混同してすみません。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

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품


릴리스

R2022a

Community Treasure Hunt

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

Start Hunting!