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

7 ビュー (過去 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
どうぞよろしくお願いいたします。

採用された回答

交感神経優位なあかべぇ
交感神経優位なあかべぇ 2022 年 10 月 7 日
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 Center および File ExchangeMatrix Indexing についてさらに検索

製品


リリース

R2022a

Community Treasure Hunt

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

Start Hunting!