我注意到将已经完整的矩阵转换为完整矩阵的速度很慢:
>> 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)
答案 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