Vectorizing loop containing multiplication of a scalar and a matrix

2 visualizzazioni (ultimi 30 giorni)
How to implement the following algorithm in a vectorized manner? (Preferably without using functions other than `mat`)
mat = @(i) [i-1, i, 0; i, i+1, 0; 0, 0, 1];
w = [0.2,0.5,1,0.5,0.2];
s = 0;
for j = 1:5
s = s + w(j)*mat(j);
end
the result is
s =
4.8 7.2 0.0
7.2 9.6 0.0
0.0 0.0 2.4

Risposta accettata

Bruno Luong
Bruno Luong il 4 Feb 2022
Modificato: Bruno Luong il 4 Feb 2022
w = [0.2,0.5,1,0.5,0.2];
i=reshape(1:length(w),1,1,[]);
z = zeros(size(i));
s=sum([i-1, i, 0+z; i, i+1, 0+z; 0+z, 0+z, 1+z].*reshape(w,size(i)),3)
s = 3×3
4.8000 7.2000 0 7.2000 9.6000 0 0 0 2.4000
  6 Commenti
Bruno Luong
Bruno Luong il 4 Feb 2022
Modificato: Bruno Luong il 4 Feb 2022
"so in such situations using for loop is inevitable."
No you can use ARRAYFUN but that is no better (worse) than the for-loop
mat = @(i) [i-1, i, 0; i, i+1, 0; 0, 0, 1];
w = [0.2,0.5,1,0.5,0.2];
i = 1:5;
M=arrayfun(mat, i, 'unif', 0);
wdM = arrayfun(@(w,mc) w*mc{1}, w, M, 'unif', 0);
s=sum(cat(3,wdM{:}),3)
s = 3×3
4.8000 7.2000 0 7.2000 9.6000 0 0 0 2.4000
If you prefer such cryptic code instead of for-loop just go ahead.
Masa
Masa il 4 Feb 2022
Thanks, of course I'd rather using loops. I thought there might be some workaround using built-in functions of MATLAB (except 'arrayfun') to do the summation mentioned in the code more efficiently.

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Loops and Conditional Statements in Help Center e File Exchange

Prodotti


Release

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by