如何加快以下操作?瓶颈是第三条线,即使对于A1的大尺寸,第四条线也很快。第三行是否实际上复制了存储在A1中的A(b,b)?
A = randn(1000,1000);
b = [67 145 200 185 11 166 80 137 163 132 133 19]; %random
A1 = A(b,b);
v=A1*A(2,b)';
请注意,以下内容同样缓慢,因此我将该行拆分为两部分,以证明上面的第三行是瓶颈。
v=A(b,b);*A(2,b)';
答案 0 :(得分:0)
看看这是否会让它更快地替代你声称是瓶颈的第三条线 -
[x,y]= ndgrid(b,b);
A1 = A((y-1)*size(A,1)+x);
或者
A1 = A(bsxfun(@plus,(b-1)*size(A,1),b'));
编辑:使用上面列出的代码进行分析后,运行时性能看起来并没有提高很多。您在评论中提到您在循环中多次使用这些代码,而b
会有所不同。如果循环计数是一个很小的值并且b
是这些循环迭代之间的常数,那么可以想到在所有迭代中执行所有那些矩阵向量乘法到一个大的矩阵 - 矩阵乘法,但这不是&#39在这里的情况。所以,在这一点上我会说,indexing
的瓶颈可能不得不停留。