这很奇怪,我看到f更快,而g比你看到的慢。但是他们对我来说都是一样的。也许不同版本的MATLAB?
>> g = @() zeros(1000, 0) * zeros(0, 1000);
>> f = @() zeros(1000)
f =
@()zeros(1000)
>> timeit(f)
ans =
8.5019e-04
>> timeit(f)
ans =
8.4627e-04
>> timeit(g)
ans =
8.4627e-04
编辑可以添加1的f和g的结尾,并看看你得到什么时间。
编辑2013年1月6日7:42 EST
我正在使用一台机器远程,所以抱歉低质量的图形(不得不生成他们盲目的)。
机器配置:
i7 920. 2.653 GHz。 Linux。 12 GB RAM。 8MB缓存。
它看起来甚至我可以访问的机器显示这种行为,除了在更大的尺寸(1979年和2073之间的某个地方)。没有理由我现在可以想到的空矩阵乘法在更大的尺寸更快。
我会在回来之前多调查一下。
EDIT 2013年1月11日
在@ EitanT的帖子后,我想做一点点挖。我写了一些C代码,看看matlab可能如何创建一个零的矩阵。这里是我使用的c代码。
int main(int argc, char **argv)
{
for (int i = 1975; i <= 2100; i+=25) {
timer::start();
double *foo = (double *)malloc(i * i * sizeof(double));
for (int k = 0; k < i * i; k++) foo[k] = 0;
double mftime = timer::stop();
free(foo);
timer::start();
double *bar = (double *)malloc(i * i * sizeof(double));
memset(bar, 0, i * i * sizeof(double));
double mmtime = timer::stop();
free(bar);
timer::start();
double *baz = (double *)calloc(i * i, sizeof(double));
double catime = timer::stop();
free(baz);
printf("%d, %lf, %lf, %lf\n", i, mftime, mmtime, catime);
}
}
这里是结果。
$ ./test
1975, 0.013812, 0.013578, 0.003321
2000, 0.014144, 0.013879, 0.003408
2025, 0.014396, 0.014219, 0.003490
2050, 0.014732, 0.013784, 0.000043
2075, 0.015022, 0.014122, 0.000045
2100, 0.014606, 0.014480, 0.000045
正如你可以看到calloc(第4列)似乎是最快的方法。它也在2025年和2050年之间显着更快(我认为它将在2048左右?)。
现在我回到matlab检查相同。这里是结果。
>> test
1975, 0.003296, 0.003297
2000, 0.003377, 0.003385
2025, 0.003465, 0.003464
2050, 0.015987, 0.000019
2075, 0.016373, 0.000019
2100, 0.016762, 0.000020
看起来f()和g()都使用较小大小的calloc(<2048?)。但是在更大的大小f()(zeros(m,n))开始使用malloc memset,而g()(zeros(m,0)* zeros(0,n) 因此,通过以下解释分歧
> zeros(..)开始在较大的大小使用不同的(较慢?)方案。
> calloc也有些出乎意料地表现,导致性能的提高。
这是Linux上的行为。有人可以在不同的机器(也许不同的操作系统)上做同样的实验,看看实验是否成立?