将完整矩阵转换为完整矩阵的速度很慢?

时间:2013-02-26 15:56:37

标签: matlab matrix sparse-matrix

我注意到将已经完整的矩阵转换为完整矩阵的速度很慢:

>> tic; for k = 1:100; x = uint16(ones(10000,100)); end; toc
Elapsed time is 0.035748 seconds.
>> tic; for k = 1:100; x = uint16(uint16(ones(10000,100))); end; toc
Elapsed time is 0.034180 seconds.
>> tic; for k = 1:100; x = full(uint16(ones(10000,100))); end; toc
Elapsed time is 0.460977 seconds. %%%%% SLOW!

我在没有uint16的情况下进行了测试:

>> tic; for k = 1:100; x = ones(10000,100); end; toc
Elapsed time is 0.060028 seconds.
>> tic; for k = 1:100; x = full(ones(10000,100)); end; toc
Elapsed time is 0.229058 seconds. %%%%% SLOW!

同样的效果。

这是为什么? full应该只将稀疏矩阵转换为完整矩阵。如果它已经满了,它不应该什么都不做吗?

编辑:issparse超快!我想作为一个MEX,它主要是内存成本?

Mac OS X上的MATLAB版本7.13.0.564(R2011b)

2 个答案:

答案 0 :(得分:1)

full效果很好。

慢的部分实际上是ones(10000, 100) ......这是证据:

>> tic, for k = 1:100, x = ones(10000,100); end, toc
Elapsed time is 0.043143 seconds.

>> A = ones(10000,100);
>> tic, for k = 1:100, x = full(A); end, toc
Elapsed time is 0.000081 seconds.
使用非稀疏矩阵调用

full并快速运行,因此它不是减速的原因。

答案 1 :(得分:1)

免责声明:这是我对正在发生的事情的最好猜测,但我不确定在Matlab的内容下发生了什么。 更新:在评论中,EitanT指出我的猜测很可能是错误的。

我认为Matlab的JIT engine正在对其中一些案例进行优化,但不是全部。

当你有一个创建变量但从未使用过的循环时,JIT引擎不会一遍又一遍地创建该变量。它只做了一次。这样的事情会很快:

% this calls 'ones' once
for i = 1:100, x = ones(10000,100); end

但是如果你创建一个变量然后使用它,比如将它传递给一个函数,那么每次都会创建该变量。显然,这需要更多时间。

% this calls 'ones' every iteration to pass to `full`
for i = 1:100, x = full(ones(10000,100)); end