2

我在 matlab 中编写了一个小循环来生成随机 NxN 矩阵。循环是

tic
for i=1:10000
    u=rand(1,10000);
    tau(i,:)=d.*(u(1,:)-0.5);
end
toc

我第一次只尝试了一次循环例程,

    u=rand(1,10000);
    tau=d.*(u(1,:)-0.5);

这在 0.000169 秒内给了我 tau。我假设循环将花费大约 1.69 秒。没有,粉丝们疯狂地花了 555.018280 秒。

是否有
a)速度与迭代次数不呈线性关系的原因?
b)为什么多次执行例程需要更长的时间的原因c
加速这个的方法(我实际上想生成更大的矩阵),例如更好的循环或给我的方法,比如说,同类型的 1'000'000x1'000'000 矩阵?

4

2 回答 2

7

您必须首先预先分配您的矩阵tau,即

  tau = zeros(10000,10000);

否则matlab将在有足够空闲内存的区域不断重新分配它(=>找到一个有足够空闲空间+硬拷贝的区域)。

一般来说,您将获得更好的性能矢量化整个过程:

 u=rand(10000,10000);
 tau=d.*(u-0.5);

编辑:最重要的是,在下面的评论中听取罗迪的明智建议。(无论如何,我这会比串行执行 rand(a,b)快一点)。arand(1,b)

于 2012-11-19T14:15:54.300 回答
0

一种明显的可能性是内存访问量。测试循环的内存可能完全在缓存中,但是由完整循环写入的内存需要大量的主内存访问。

这是一个可检验的假设:时间写整个矩阵,而不做算术。

如果我了解 Matlab 索引,您可能会更快地切换尺寸,以便您编写位于同一列而不是同一行的块。将 u 转换为循环外的列向量也可能会有所帮助。一般来说,大矩阵访问应该尽可能按内存顺序进行。

于 2012-11-19T14:21:10.653 回答