Как можно суммировать матричные элементы в MATLAB? - PullRequest
11 голосов
/ 12 ноября 2009

Учитывая матрицу:

A = [1 2 3; 4 5 6; 7 8 9];
  1. Как вы могли бы использовать цикл for для вычисления суммы элементов в матрице?
  2. Напишите однострочную команду MATLAB, используя функцию sum для суммирования матричные элементы в A.

Мой ответ:

1)

for j=1:3,
    for i=j:3,
        A(i,:) = A(i,:)+A(j+1,:)+A(j+2,:)
    end
end

2)

sum(A)

Это правильные ответы? Я не знал, как использовать if, while и for. Кто-нибудь может мне это объяснить?

Ответы [ 6 ]

31 голосов
/ 08 октября 2013

Для очень больших матриц использование sum(sum(A)) может быть быстрее, чем 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.
18 голосов
/ 12 ноября 2009

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(:));
10 голосов
/ 12 ноября 2009

Другой ответ на первый вопрос - использовать one для цикла и выполнить линейное индексирование в массив, используя функцию NUMEL , чтобы получить общее число элементы:

total = 0;
for i = 1:numel(A)
  total = total+A(i);
end
3 голосов
/ 15 июля 2011

По возможности избегайте циклов.

sum(A(:))

замечательно, однако, если у вас есть логическая индексация, вы не можете использовать (:), но вы можете написать

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

Так как сумма суммирует столбцы и суммирует вектор строки, который был создан первой суммой. Обратите внимание, что это работает, только если матрица 2-дим.

2 голосов
/ 08 апреля 2014

Лучше всего избегать циклов или рекурсий в Matlab.

Между sum(A(:)) и sum(sum(A)). По моему опыту, массивы в Matlab, похоже, хранятся в непрерывном блоке в памяти как сложенные векторы столбцов. Таким образом, форма A не имеет большого значения в sum(). (Можно проверить reshape() и проверить, быстро ли изменение формы в Matlab. Если это так, у нас есть основания полагать, что форма массива не имеет прямого отношения к способу хранения и обработки данных.)

Таким образом, нет причины, по которой sum(sum(A)) должен быть быстрее. Было бы медленнее, если бы Matlab фактически создал вектор-строку, записывающий сначала сумму каждого столбца A, а затем сумму по столбцам. Но я думаю, что sum(sum(A)) очень распространен среди пользователей. Вполне вероятно, что они жестко кодируют sum(sum(A)) как один цикл, то же самое, что и sum(A(:)).

Ниже я предлагаю некоторые результаты тестирования. В каждом тесте A = rand (размер) и размер указываются в отображаемых текстах.

Сначала используется тик-ток.

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

Ниже используется 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);

По моему опыту, оба таймера имеют значение только до 0,1 с. Таким образом, если у вас есть подобный опыт работы с таймерами Matlab, ни один из тестов не может различить sum(A(:)) и sum(sum(A)).

Я несколько раз пробовал максимально допустимый размер на моем компьютере.

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

Они кажутся эквивалентными. Либо один хорошо. Но sum(sum(A)) требует, чтобы вы знали, что размер вашего массива равен 2.

0 голосов
/ 01 апреля 2014

Вы пытаетесь суммировать все элементы двумерного массива

В Matlab использовать

Array_Sum = sum (sum (Array_Name));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...