How to avoid repeated computation when the result is a symmetric matrix?
Ältere Kommentare anzeigen
Hi all,
When obtaining a symmetric matrix, we know that we only need to compute and store the elements of upper triangular part. Is there a way to only perform these computations related to the upper triangular part, such that the total number of computation can be reduced by almost half?
Check this example:
clear; clc;
a = rand(5, 1);
b = rand(5, 1);
c = rand(5, 1);
x = {a b c};
xtx = zeros(3, 3);
for i = 1:3
for j = 1:3
pass = x{i}' * x{j};
xtx(i, j) = xtx(i, j) + pass;
end
end
'xtx' is symmetric, but the for loop here computed all elements. Total number of vector products is 9, while we know only 6 products are really needed. If the number of computations is large, then the saving can be dramatic. So how can we solve this?
Many thanks!
4 Kommentare
When using a for loop it should simply be a case of the inner loop running as
for j = (i+1):3
and then updating both xtx( i, j ) and xtx( j, i ).
For a more general solution where a vectorised approach is used it is less simple though and I'll leave that to someone else!
Xh Du
am 30 Mär. 2017
Xh Du
am 30 Mär. 2017
Adam
am 30 Mär. 2017
I started out with that and changed it. You can just calculate the diagonal separately, but I guess j = i:3 is fine after all.
Akzeptierte Antwort
Weitere Antworten (0)
Kategorien
Mehr zu Creating and Concatenating Matrices finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!