Решение, которое вы указали сами, а также mapslices
, оба работают нормально. Но если «рекомендуется», что вы действительно имеете в виду, это «высокопроизводительный», тогда лучший ответ: не перебирайте строки.
Проблема заключается в том, что, поскольку массивы хранятся в основном порядке столбцов, для чего-либо другого, кроме небольшой матрицы, вы получите плохой cache hit ratio, если вы пересечете массив в порядке строки.
Как отмечалось в excellent blog post, если вы хотите суммировать по строкам, то лучше всего, чтобы сделать что-то вроде этого:
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. Вы можете наивно полагать, что лучше пройти его в порядке строк и скопировать результат в переменную , но на любой современной машине кеш промах намного дороже, чем поиск msum[i]
.
Многие внутренние алгоритмы Юлии, которые принимают параметр region
, например sum(m, 2)
, обрабатывают это для вас.
mapslices? 'mapslices (sum, m, 2)' делает последнее – jverzani
@jverzani mapslices выполняет эту работу, хотя в некоторых случаях для этого потребуется определить анонимную функцию. Спасибо за предложения. – Nico