各対角番号に対する対角和からなる配列
Show older comments
写真のような正方行列Aを持っている際に、自身より右下の第k対角成分の和をとった行列Bを作成したいのですが、何か簡単に書く方法はないでしょうか。

現在は縮小行列を作り、各縮小行列の第j番目の対角成分を取得する形で計算していますが、かなり遅いし効率も悪いなと感じています。
A = reshape(1:9,3,3);
B = zeros(3,3);
for i = 1:3
A_partial = A(i:end,i:end);
for j = 1:3-i+1
B(i,i+j-1) = sum(diag(A_partial,j-1));
B(i+j-1,i) = sum(diag(A_partial,-1*(j-1)));
end
end
A
B
2 Comments
Atsushi Ueno
on 3 Oct 2022
メモ:同じ主旨の問題がCodyに登録されました。逆の対角方向を選択するオプションも求められます。これを解くと他のCody参加者の回答を閲覧する事が出来ます。突飛なアイデアを持つ回答者が沢山いますよ。
Yamada Taro
on 3 Oct 2022
Accepted Answer
More Answers (1)
Hernia Baby
on 6 Sep 2022
Edited: Hernia Baby
on 6 Sep 2022
clc,clear;
A = reshape(1:9,3,3);
B = zeros(size(A));
キモとなる関数です
f = @(X,x) diag(flip(cumsum(flip(diag(X,x)))),x);
上記の関数を - (行番号 - 1) ~ 列番号 - 1 分行います
-1としているのは角っこは計算する必要がないからです。
時間も計測してみましょうかね
tic
for ii = -height(A)+1:width(A)-1
B = B + f(A,ii);
end
toc
確認してみましょう
B
1 Comment
Yamada Taro
on 22 Sep 2022
Categories
Find more on Creating and Concatenating Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!