Ответ 1
Решение, которое вы указали сами, а также mapslices
, отлично работает. Но если "рекомендуется", что вы действительно имеете в виду, это "высокопроизводительный", тогда лучший ответ: не перебирайте строки.
Проблема заключается в том, что поскольку массивы хранятся в основном порядке столбцов, для чего-либо другого, кроме маленькой матрицы, вы получите плохое отношение кэш-памяти, если вы перемещаете массив в строчном порядке.
Как указано в отличном сообщении в блоге, если вы хотите суммировать по строкам, лучше всего сделать что-то вроде этого:
msum = zeros(eltype(m), size(m, 1))
for j = 1:size(m,2)
for i = 1:size(m,1)
msum[i] += m[i,j]
end
end
Мы перемещаем как m
, так и msum
в свой собственный порядок хранения, поэтому каждый раз, когда мы загружаем строку кеша, мы используем все значения, что дает коэффициент попадания в кэш 1. Вы можете наивно думать, что лучше пройти его в строчном порядке и накапливать результат в переменную tmp
, но на любой современной машине промах кэша намного дороже, чем поиск msum[i]
.
Многие внутренние алгоритмы Julia, которые принимают параметр region
, например sum(m, 2)
, обрабатывают это для вас.