Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中最快的变尺寸阵列初始化_Matlab_Optimization - Fatal编程技术网

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 =

在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
(人们认为
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