Get the diagonal without calculating the explicit matrix

1 回表示 (過去 30 日間)
Long Hong
Long Hong 2020 年 3 月 26 日
編集済み: Matt J 2020 年 3 月 26 日
Dear all:
I am trying to calculate a diagonal of a matrix (denoted A), which is formed by multiplying two large-dimensional matrices (denoted as B*C).
A naive way to do it is: first, calculating explicitly A = B*C, then get diagonal out from A. However, the first step takes forever to run due to the high-dimension of B and C. But the only thing I need is the diagonal of A.
Another straightforward way in my mind is: I could create a loop by calculating each element of the diagonal of A one by one. It will surely save a lot of time, but I am not sure if this is the most efficient way.
I am wondering if anyone knows a faster/smarter way to calculate it.
Thank you very much in advance!
Best,
Long
  1 件のコメント
Matt J
Matt J 2020 年 3 月 26 日
編集済み: Matt J 2020 年 3 月 26 日
The best approach will depend on the dimensions of the matrices, and whether they are of sparse-type or not.

サインインしてコメントする。

採用された回答

Matt J
Matt J 2020 年 3 月 26 日
編集済み: Matt J 2020 年 3 月 26 日
Assuming B*C results in a square matrix,
diagonal=sum(B.' .* C, 1);
  8 件のコメント
Long Hong
Long Hong 2020 年 3 月 26 日
Thank you the cyclist! Do you have any insight in doing the transpose quicker? I am a bit confused here.
Matt J
Matt J 2020 年 3 月 26 日
編集済み: Matt J 2020 年 3 月 26 日
the cyclist means you might avoid the transpose by loading data column-wise instead of row-wise when you first build B.

サインインしてコメントする。

その他の回答 (1 件)

the cyclist
the cyclist 2020 年 3 月 26 日
Here is one way:
% Make up some inputs
N = 4;
B = rand(N);
C = rand(N);
% Calculate the diagonal
A_diag = 0;
for nr = 1:N
A_diag = A_diag + B(:,nr).*C(nr,:)';
end
  1 件のコメント
Long Hong
Long Hong 2020 年 3 月 26 日
Thanks the cyclist! This is a method I have applied currently.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeOperating on Diagonal Matrices についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by