MATLAB中最快的变尺寸阵列初始化
在MATLAB中,我将任意大小的数组作为输入MATLAB中最快的变尺寸阵列初始化,matlab,optimization,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 =
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
(人们认为one()
是最快的)
那么,我的问题是,我的结果正确吗?如果是这样的话,
w=z-z+k
是初始化k
数组的最快方法,还是还有更好的方法?也许还有更快的方法
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.
尽管我不知道为什么。如果你仔细观察,你会发现很多更模糊的初始化数组的方法 例如,请参阅以了解真正意想不到的问题 如果您想在它们之间进行速度选择,您需要比较
z
的一系列大小的计时,而不仅仅是1000x1000,因为它们的伸缩性都非常不同(甚至可能不是单调的,因为当数组达到某个阈值大小时,MATLAB会突然切换到不同的内存分配方法)。我刚刚试过你的三种方法,在较小的尺寸下,我发现第一种比第二种快得多
正如@horchler所提到的,计时也将取决于MATLAB版本、操作系统、处理器缓存大小等。一个不应忘记的基本方法(而且速度也相当快):
我通常使用这个或
zero(size(z))+k
这取决于平台和/或版本。在R2012b、OSX上,基于one
和zero
的方法实际上是第三种方法的两倍。看看您是否想尝试其他方案。我建议您不要使用第三种方法,如果z
包含NaN
或Inf
某个地方的结果会很混乱。+1作为参考,仍然希望我们找到一种比默认方法更快的分配方法。您确定它更快吗,对我来说,测量值仍然遍布n=1000
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.
w=repmat(k,size(z));
tic; for n = 1:1000, w=repmat(k,size(z)); end; toc