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

8 次查看(过去 30 天)
gafakel
gafakel2022-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 个评论
gafakel
gafakel 2022-10-12
コメントいただきありがとうございます!ただ、今回は0が入りえる状況のため、補足いただいた手法だと難しそうです……。
% ここで、0が入るかもしれないために"Atril>=0"でなければならない
AtrilVec = Atril(Atril >= 0)
ただ、ご教示いただいたように条件文を要素として与えてもよいという点は大変参考になりました。ありがとうございます!

请先登录,再进行评论。

更多回答(0 个)

类别

Find more on ループと条件付きステートメント in Help Center and File Exchange

产品


版本

R2022a

Community Treasure Hunt

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

Start Hunting!