What are the ways to sum matrix elements in MATLAB?

前端 未结 6 2059
天涯浪人
天涯浪人 2021-02-08 01:26

Given the matrix:

A = [1 2 3; 4 5 6; 7 8 9];
  1. How could you use a for loop to compute the sum of the elements in the matrix?
  2. Writ
相关标签:
6条回答
  • 2021-02-08 01:47

    For very large matrices using sum(sum(A)) can be faster than sum(A(:)):

    >> A = rand(20000);
    >> tic; B=sum(A(:)); toc; tic; C=sum(sum(A)); toc
    Elapsed time is 0.407980 seconds.
    Elapsed time is 0.322624 seconds.
    
    0 讨论(0)
  • 2021-02-08 01:49

    1)

    total = 0;
    for i=1:size(A,1)
      for j=1:size(A,2)
        total = total + A(i,j);
      end
    end
    

    2)

    total = sum(A(:));
    
    0 讨论(0)
  • 2021-02-08 01:53

    Another answer for the first question is to use one for loop and perform linear indexing into the array using the function NUMEL to get the total number of elements:

    total = 0;
    for i = 1:numel(A)
      total = total+A(i);
    end
    
    0 讨论(0)
  • 2021-02-08 01:59

    You are trying to sum up all the elements of 2-D Array

    In Matlab use

    Array_Sum = sum(sum(Array_Name));

    0 讨论(0)
  • 2021-02-08 02:00

    The best practice is definitely to avoid loops or recursions in Matlab.

    Between sum(A(:)) and sum(sum(A)). In my experience, arrays in Matlab seems to be stored in a continuous block in memory as stacked column vectors. So the shape of A does not quite matter in sum(). (One can test reshape() and check if reshaping is fast in Matlab. If it is, then we have a reason to believe that the shape of an array is not directly related to the way the data is stored and manipulated.)

    As such, there is no reason sum(sum(A)) should be faster. It would be slower if Matlab actually creates a row vector recording the sum of each column of A first and then sum over the columns. But I think sum(sum(A)) is very wide-spread amongst users. It is likely that they hard-code sum(sum(A)) to be a single loop, the same to sum(A(:)).

    Below I offer some testing results. In each test, A=rand(size) and size is specified in the displayed texts.

    First is using tic toc.

    Size 100x100
    sum(A(:))
    Elapsed time is 0.000025 seconds.
    sum(sum(A))
    Elapsed time is 0.000018 seconds.
    
    Size 10000x1
    sum(A(:))
    Elapsed time is 0.000014 seconds.
    sum(A)
    Elapsed time is 0.000013 seconds.
    
    Size 1000x1000
    sum(A(:))
    Elapsed time is 0.001641 seconds.
    sum(A)
    Elapsed time is 0.001561 seconds.
    
    Size 1000000
    sum(A(:))
    Elapsed time is 0.002439 seconds.
    sum(A)
    Elapsed time is 0.001697 seconds.
    
    Size 10000x10000
    sum(A(:))
    Elapsed time is 0.148504 seconds.
    sum(A)
    Elapsed time is 0.155160 seconds.
    
    Size 100000000
    Error using rand
    Out of memory. Type HELP MEMORY for your options.
    
    Error in test27 (line 70)
    A=rand(100000000,1);
    

    Below is using cputime

    Size 100x100
    The cputime for sum(A(:)) in seconds is 
    0
    The cputime for sum(sum(A)) in seconds is 
    0
    
    Size 10000x1
    The cputime for sum(A(:)) in seconds is 
    0
    The cputime for sum(sum(A)) in seconds is 
    0
    
    Size 1000x1000
    The cputime for sum(A(:)) in seconds is 
    0
    The cputime for sum(sum(A)) in seconds is 
    0
    
    Size 1000000
    The cputime for sum(A(:)) in seconds is 
    0
    The cputime for sum(sum(A)) in seconds is 
    0
    
    Size 10000x10000
    The cputime for sum(A(:)) in seconds is 
    0.312
    The cputime for sum(sum(A)) in seconds is 
    0.312
    
    Size 100000000
    Error using rand
    Out of memory. Type HELP MEMORY for your options.
    
    Error in test27_2 (line 70)
    A=rand(100000000,1);
    

    In my experience, both timers are only meaningful up to .1s. So if you have similar experience with Matlab timers, none of the tests can discern sum(A(:)) and sum(sum(A)).

    I tried the largest size allowed on my computer a few more times.

    Size 10000x10000
    sum(A(:))
    Elapsed time is 0.151256 seconds.
    sum(A)
    Elapsed time is 0.143937 seconds.
    
    Size 10000x10000
    sum(A(:))
    Elapsed time is 0.149802 seconds.
    sum(A)
    Elapsed time is 0.145227 seconds.
    
    Size 10000x10000
    The cputime for sum(A(:)) in seconds is 
    0.2808
    The cputime for sum(sum(A)) in seconds is 
    0.312
    
    Size 10000x10000
    The cputime for sum(A(:)) in seconds is 
    0.312
    The cputime for sum(sum(A)) in seconds is 
    0.312
    
    Size 10000x10000
    The cputime for sum(A(:)) in seconds is 
    0.312
    The cputime for sum(sum(A)) in seconds is 
    0.312
    

    They seem equivalent. Either one is good. But sum(sum(A)) requires that you know the dimension of your array is 2.

    0 讨论(0)
  • 2021-02-08 02:07

    Avoid for loops whenever possible.

    sum(A(:))
    

    is great however if you have some logical indexing going on you can't use the (:) but you can write

    % Sum all elements under 45 in the matrix
    sum ( sum ( A *. ( A < 45 ) )
    

    Since sum sums the columns and sums the row vector that was created by the first sum. Note that this only works if the matrix is 2-dim.

    0 讨论(0)
提交回复
热议问题