(下)三角行列の要素だけを別の変数として抽出したい
6 ビュー (過去 30 日間)
古いコメントを表示
お世話になっております。表題の件について、下記のように自分でも方法は思いついたのですが、もっと効率的な方法がないかと思い質問させていただきます。
今、次の行列Aを考えます。
% size of matrix
dim=5;
% example of matrix
A=magic(dim)
ここで、行列Aの下三角行列の成分だけを取ってみると(対角要素も除く)、次のAtrilを得ます。
Atril=tril(A,-1)
このAtrilは「Aの下三角行列の要素」以外を0とするものですが、この「Aの下三角行列の要素」だけを列ベクトルとして抽出したいのです。
自分で考えたのは、この「Aの下三角行列の要素」のindexを作ってしまって抽出する方法です。
AtrilVec=Atril(find(tril(ones(dim),-1)))
どうにもこの「indexを作ってしまう」方法が非効率的に感じられたため、質問させていただきました。
それこそAtrilからfindを使ってしまってもいいのかなと思ったのですが、次のように下三角行列の要素の中に0が入っていると上手く求められず、断念しました。
B=magic(dim); B([2,4,9,15])=0;
Btril=tril(B,-1)
% これだとBtril内の(本来求めたい)0が消える
[~,~,BtrilVec]=find(Btril)
どうぞよろしくお願いいたします。
0 件のコメント
採用された回答
交感神経優位なあかべぇ
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)
AtrilVec = A(tril(true(dim), -1))
3 件のコメント
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)
その他の回答 (0 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!