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

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

>> 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)

最佳答案 免责声明:这是我对正在发生的事情的最好猜测,但我不确定在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
点赞