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

조회 수: 6 (최근 30일)
gafakel
gafakel 2022년 10월 7일
댓글: gafakel 2022년 10월 12일
お世話になっております。表題の件について、下記のように自分でも方法は思いついたのですが、もっと効率的な方法がないかと思い質問させていただきます。
今、次の行列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
どうぞよろしくお願いいたします。

채택된 답변

交感神経優位なあかべぇ
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
Akira Agata
Akira Agata 2022년 10월 11일
편집: Akira Agata 2022년 10월 11일
+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 2022년 10월 12일
コメントいただきありがとうございます!ただ、今回は0が入りえる状況のため、補足いただいた手法だと難しそうです……。
% ここで、0が入るかもしれないために"Atril>=0"でなければならない
AtrilVec = Atril(Atril >= 0)
ただ、ご教示いただいたように条件文を要素として与えてもよいという点は大変参考になりました。ありがとうございます!

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

추가 답변 (0개)

카테고리

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

제품


릴리스

R2022a

Community Treasure Hunt

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

Start Hunting!