Matlab - 用矩阵运算替代for循环

4

我希望用矩阵操作替换for循环。以下是我的代码的最小工作示例:

A = [1,2,3,4,5,6,7,8,9,10];
B= [5,2,3,4,5,1,4,7,4,2];
C = zeros(1,10);
n = length(A);
abMatrix = [1,-1,0;1,-2,1;0,-1,1];
for i=2:n-1
  C(i) = A(i-1:i+1) * abMatrix * B(i-1:i+1)';
end

这个操作是可行的,但我想在一个矩阵操作中完成对于所有i=[2,n-1]的操作。如何去掉for循环?


只是好奇:为什么要踩我? - Luis Mendo
1个回答

3

diag + bsxfun based approach -

nA = numel(A); %// Get number of elements in A
ind1 = bsxfun(@plus,[1:3]',0:nA-3); %// sliding indices
mat_mult = A(ind1)'*abMatrix*B(ind1); %// matrix multiplications of the three arrays

C(1,nA)=0 %// pre-allocate for C
C(2:end-1)=mat_mult(1:size(mat_mult,1)+1:end) %//get right values, set at right places

如果你关心代码的紧凑性,这里有一个例子 -
ind1 = bsxfun(@plus,[1:3]',0:numel(A)-3)
C = [0 ; diag(A(ind1)'*abMatrix*B(ind1)) ; 0].'

哇!只需两行代码,不需要循环! - Luis Mendo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接