在matlab中加速索引子数组?

在matlab中加速索引子数组?,matlab,indexing,Matlab,Indexing,如何加快以下操作的速度?瓶颈是第三条线,尽管对于A1的大尺寸,第四条线相当快。第三行是否真的复制了存储在A1中的Ab,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

如何加快以下操作的速度?瓶颈是第三条线,尽管对于A1的大尺寸,第四条线相当快。第三行是否真的复制了存储在A1中的Ab,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)';

看看这是否能让它更快地取代你声称是瓶颈的第三行-

[x,y]= ndgrid(b,b);
A1 = A((y-1)*size(A,1)+x);


编辑:在使用上面列出的代码进行评测之后,运行时性能看起来没有多大改善。您在评论中提到,您在循环中多次使用这些代码,而b会发生变化。如果循环计数是一个很小的值,而b在这些循环迭代之间是一个常数,那么可以考虑将所有迭代中的所有矩阵向量乘法执行为一个大的矩阵乘法,但这里不是这种情况。因此,在这一点上,我要说的是,索引的瓶颈可能必须保持。

刚刚尝试了b=randperm200100;但它不能在MatlabR2009a上运行。我不知道他们什么时候实现了第二个参数。谢谢,这实际上让它慢了一点。我的问题是关于第三行,排列刚刚给出,所以我可以表述我的问题。我特别想加速第三行,而不是给出的全部代码。你确定第三行是瓶颈吗?我刚用MATLAB profiler试过,randn似乎是罪魁祸首。你能发布profiler结果截图吗?正如我所说,这只是一个示例,我的代码要复杂得多,b的创建方式非常不同,但出于这个问题的目的,我将其设置为一个随机序列。请参阅上面的更改。您是如何分析代码的?您使用的是MATLAB profiler、tic toc、timeit还是其他什么?
A1 = A(bsxfun(@plus,(b-1)*size(A,1),b'));