(下)三角行列の要素​だけを別の変数として​抽出したい

8 Ansichten (letzte 30 Tage)
gafakel
gafakel am 7 Okt. 2022
Kommentiert: gafakel am 12 Okt. 2022
お世話になっております。表題の件について、下記のように自分でも方法は思いついたのですが、もっと効率的な方法がないかと思い質問させていただきます。
今、次の行列Aを考えます。
% size of matrix
dim=5;
% example of matrix
A=magic(dim)
A = 5×5
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
ここで、行列Aの下三角行列の成分だけを取ってみると(対角要素も除く)、次のAtrilを得ます。
Atril=tril(A,-1)
Atril = 5×5
0 0 0 0 0 23 0 0 0 0 4 6 0 0 0 10 12 19 0 0 11 18 25 2 0
このAtrilは「Aの下三角行列の要素」以外を0とするものですが、この「Aの下三角行列の要素」だけを列ベクトルとして抽出したいのです。
自分で考えたのは、この「Aの下三角行列の要素」のindexを作ってしまって抽出する方法です。
AtrilVec=Atril(find(tril(ones(dim),-1)))
AtrilVec = 10×1
23 4 10 11 6 12 18 19 25 2
どうにもこの「indexを作ってしまう」方法が非効率的に感じられたため、質問させていただきました。
それこそAtrilからfindを使ってしまってもいいのかなと思ったのですが、次のように下三角行列の要素の中に0が入っていると上手く求められず、断念しました。
B=magic(dim); B([2,4,9,15])=0;
Btril=tril(B,-1)
Btril = 5×5
0 0 0 0 0 0 0 0 0 0 4 6 0 0 0 0 0 19 0 0 11 18 0 2 0
% これだとBtril内の(本来求めたい)0が消える
[~,~,BtrilVec]=find(Btril)
BtrilVec = 6×1
4 11 6 18 19 2
どうぞよろしくお願いいたします。

Akzeptierte Antwort

交感神経優位なあかべぇ
index作成の、find(tril(ones(dim),-1)) の部分ですが、ones(dim)による数値配列ではなく、true(dim)を使用したlogical配列にすれば、findを介さずともインデックス指定ができるので、少しだけ効率的になると思います。
% size of matrix
dim=5;
% example of matrix
A=magic(dim)
A = 5×5
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
AtrilVec = A(tril(true(dim), -1))
AtrilVec = 10×1
23 4 10 11 6 12 18 19 25 2
  3 Kommentare
Akira Agata
Akira Agata am 11 Okt. 2022
Bearbeitet: Akira Agata am 11 Okt. 2022
+1
もし下三角行列の成分が必ず正の数であれば、以下の方法でも実現可能です。
% size of matrix
dim = 5;
% example of matrix
A = magic(dim);
% 下三角行列を作成
Atril = tril(A, -1);
% 正の数だけを抽出
AtrilVec = Atril(Atril > 0)
AtrilVec = 10×1
23 4 10 11 6 12 18 19 25 2
gafakel
gafakel am 12 Okt. 2022
コメントいただきありがとうございます!ただ、今回は0が入りえる状況のため、補足いただいた手法だと難しそうです……。
% ここで、0が入るかもしれないために"Atril>=0"でなければならない
AtrilVec = Atril(Atril >= 0)
ただ、ご教示いただいたように条件文を要素として与えてもよいという点は大変参考になりました。ありがとうございます!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Matrix Indexing 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!