1

我在重复多次的代码中嵌入了两个 for 循环。我想加快速度:

for i = 1:10
 for j = 1:10
  A(i,j) = B(i,j,D(i,j))*C(i,j); 
 end 
end 

这里 D 由整数组成,这些整数是 B 的索引。不依赖于 D 的 for 循环可以由元素矩阵乘法代替。问题是如何以优雅的方式评估 B。我搜索了 SO 和 mathworks-pages 并尝试了线性索引,但这会产生错误:

d = reshape(D, 100, []);
b = reshape(B, 100, []);
arrayfun(@(x) b(x,d(x)), 1:100);

我究竟做错了什么?有没有办法替换两个for循环?

4

2 回答 2

1

您可以转换D为线性索引:

[rows,cols]=ndgrid(1:10,1:10);
idx = sub2ind(size(B),rows(:),cols(:),D(:));

A = zeros(10,10); %# initialize A to the right size
A(:) = B(idx).*C(:);
于 2013-05-08T20:03:20.133 回答
0

您可以对按索引排序B的层使用元素乘法(请注意,您首先沿着行循环,然后是列,这意味着您直接到行的末尾,然后到下一行等等......这就是为什么我转置并重塑为 column )。ADD

一个简单的方法是使用bsxfun()

out = bsxfun(@times, A(:,:,reshape(D',[],1)), B);

其中每一层的输出是:

out(:,:,1)   = A(:,:,D(1,1)).*B(:,:)
out(:,:,2)   = A(:,:,D(1,2)).*B(:,:)
...
out(:,:,ncols*(i-1) + j) = A(:,:,D(i,j)).*B(:,:)

如果这不是你想要的,我的错。我将删除答案。

于 2013-05-08T17:38:11.990 回答