在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
数组的最快方法,还是更好?
答案 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