MATLAB中最快的可变大小数组初始化

时间:2013-07-10 15:23:51

标签: matlab optimization

在MATLAB中,我将输入z作为任意大小的数组。我现在希望创建一个具有w相同维度的数组z,但其值无处不在k,有些实数。以下是我想到的两种方式:

z = rand(1000,1000); % pretend the size of z is not known beforehand
k = 2.3;

w = ones(size(z))*k;
w = zeros(size(z)) + k;
w = z - z + k;

我试着看看哪种方法最快,并对结果感到非常惊讶:

tic; for n = 1:1000, w = ones(size(z))*k; end; toc
tic; for n = 1:1000, w = zeros(size(z)) + k; end; toc
tic; for n = 1:1000, w = z - z + k; end; toc

Elapsed time is 7.243662 seconds.
Elapsed time is 4.770328 seconds.
Elapsed time is 2.750093 seconds.

更令人惊讶的是k = 1(人们认为ones()会是最快的)

tic; for n = 1:1000, w = ones(size(z)); end; toc
tic; for n = 1:1000, w = z - z + 1; end; toc

Elapsed time is 4.856666 seconds.
Elapsed time is 2.759324 seconds.

我的问题是,我的结果是否正确?如果是这样,w = z - z + k是初始化k数组的最快方法,还是更好?

3 个答案:

答案 0 :(得分:1)

如果你看起来足够努力,你会发现更多模糊的方法来初始化数组。

例如,请参阅this question了解真正意外的一个。

如果你想在它们之间选择速度,你需要比较z的一系列尺寸的时间,而不仅仅是1000x1000,因为它们的尺度会有很大不同(甚至可能不是单调的,如当阵列达到某个阈值大小时,MATLAB将突然切换到不同的内存分配方法。我刚尝试了你的三种方法,在较小的尺寸下,我发现第一种方法比第二种方法快得多。

正如@horchler所提到的,时间也取决于MATLAB版本,操作系统,处理器缓存大小等。

答案 1 :(得分:0)

也许更快的方式是

w = zeros(size(z,1),size(z,2)) + k;

tic; for n = 1:1000, w = zeros(size(z,1),size(z,2)) + k; end; toc
Elapsed time is 2.120249 seconds.

虽然这让我感到很震惊。

答案 2 :(得分:0)

一个不应该忘记的基本方法(也很快):

w=repmat(k,size(z));

tic; for n = 1:1000, w=repmat(k,size(z)); end; toc

我通常会使用此zeros(size(z))+k