Vectorizing loop containing multiplication of a scalar and a matrix

2 visualizaciones (últimos 30 días)
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

Respuesta aceptada

Bruno Luong
Bruno Luong el 4 de Feb. de 2022
Editada: Bruno Luong el 4 de Feb. de 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 comentarios
Bruno Luong
Bruno Luong el 4 de Feb. de 2022
Editada: Bruno Luong el 4 de Feb. de 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 el 4 de Feb. de 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.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Productos


Versión

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by