Vectorizing loop containing multiplication of a scalar and a matrix

3 次查看(过去 30 天)
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

采纳的回答

Bruno Luong
Bruno Luong 2022-2-4
编辑:Bruno Luong 2022-2-4
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 个评论
Bruno Luong
Bruno Luong 2022-2-4
编辑:Bruno Luong 2022-2-4
"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 2022-2-4
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.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

产品


版本

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by