固有ベクトルの向き

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 Center および File ExchangeLogical についてさらに検索

製品


リリース

R2022a

Community Treasure Hunt

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

Start Hunting!