Is indexing vectors in MATLAB inefficient?

前端 未结 3 935
-上瘾入骨i
-上瘾入骨i 2020-12-02 10:09

Background

My question is motivated by simple observations, which somewhat undermine the beliefs/assumptions often held/made by experienced MATLAB u

3条回答
  •  误落风尘
    2020-12-02 11:07

    Just a quick note to show how in 8 years of development, the performance characteristics of MATLAB have changed a lot.

    This is on R2017a (5 years after OP's post):

    Elapsed time is 0.000079 seconds.    % x = zeros(1,1e8);
    Elapsed time is 0.101134 seconds.    % x(:) = 1;
    Elapsed time is 0.578200 seconds.    % x(1:end) = 2;
    Elapsed time is 0.569791 seconds.    % x(1:1e8) = 3;
    Elapsed time is 1.602526 seconds.    % id = 1:1e8; x(id) = 4;
    Elapsed time is 0.373966 seconds.    % for i=1:numel(x), x(i) = 5; end
    Elapsed time is 0.374775 seconds.    % for i=1:1e8, x(i) = 6; end
    

    Note how the loop for 1:numel(x) is faster than indexing x(1:end), it seems that the array 1:end is still being created, whereas for the loop it is not. It is now better in MATLAB to not vectorize!

    (I did add an assignment x(:)=0 after allocating the matrix, outside of any timed regions, to actually have the memory allocated, since zeros only reserves the memory.)


    On MATLAB R2020b (online) (3 years later) I see these times:

    Elapsed time is 0.000073 seconds.    % x = zeros(1,1e8);
    Elapsed time is 0.084847 seconds.    % x(:) = 1;
    Elapsed time is 0.084643 seconds.    % x(1:end) = 2;
    Elapsed time is 0.085319 seconds.    % x(1:1e8) = 3;
    Elapsed time is 1.393964 seconds.    % id = 1:1e8; x(id) = 4;
    Elapsed time is 0.168394 seconds.    % for i=1:numel(x), x(i) = 5; end
    Elapsed time is 0.169830 seconds.    % for i=1:1e8, x(i) = 6; end
    

    x(1:end) is now optimized in the same as x(:), the vector 1:end is no longer being explicitly created.

提交回复
热议问题