Лучше всего избегать циклов или рекурсий в 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.