2

在 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.

更令人惊讶的是 for 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,还是有更好的方法?

4

3 回答 3

1

如果你仔细观察,你会发现初始化数组的方法更加晦涩难懂。

例如,看到这个问题是一个非常出乎意料的问题。

如果您想在它们之间进行选择以提高速度,您将需要比较一系列大小的时序z,而不仅仅是 1000x1000,因为它们的缩放比例都会完全不同(甚至可能不是单调的,因为 MATLAB 会突然切换到不同的内存分配数组达到某个阈值大小时的方法)。我刚刚尝试了你的三种方法,在较小的尺寸下,我发现第一种比第二种快得多。

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

于 2013-07-10T16:39:23.163 回答
0

一种不应该忘记的基本方法(并且也相当快):

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

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

我通常会选择这个或zeros(size(z))+k

于 2013-07-11T16:03:00.037 回答
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.

虽然我不知道为什么。

于 2013-07-10T15:28:33.403 回答