Юлия эквивалентна movmean (массив, окно, димс)? - PullRequest
0 голосов
/ 15 ноября 2018

Я использую julia 0.7.0, NCDatasets.jl и Images.jl на коробке linux для анализа набора данных размером около 80 ГБ.Я не загружаю много переменных, и первым делом я делаю эквивалент

a = moveman(movemean(movemean(array,window,1),window,2),window,4))

матрицы Matlab, где массив - это (256,256,80,600) массив с плавающей точкой.Для этого я пробую строку:

filtered = imfilter(array, centered(ones(window_h,window_h,1,window_t)/(window_t*window_h*window_h)),Inner())

Тем не менее, это приводит к терабайтам выделений, которые заканчиваются использованием всей моей памяти и возрастом.Линия matlab работает просто отлично и использует незначительное количество времени по сравнению с моей линией julia, что говорит о том, что я делаю что-то неоптимальным образом.

Может ли кто-нибудь дать какое-то понимание?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Чтобы ответить на мой собственный вопрос, основываясь на обсуждении на Джулия дискурс : я продолжил использовать пакет изображений, в частности ImageFiltering, следующим образом. Сначала я определяю ядро, используемое для сглаживания. Это ядро ​​будет использоваться для вычисления корреляции между ним и фильтруемым массивом.

Разница в использовании ядер factores заключается в том, что каждый фильтр будет применяться отдельно, что приведет к изменению количества операций с

window_h x window_h x window_t

до

window_h + window_h + window_t

Как объяснено в документах .

Обратите внимание, что ядро ​​использует [1.0] в третьем измерении, потому что мой массив представляет собой 4-мерный массив, и я сглаживаю первые два и четвертое измерение.

using ImageFiltering  

function kernel4d_2(window_h,window_t)
    kernel_h = ones(window_h)/window_h
    kernel_t = ones(window_t)/window_t
    return kernelfactors((kernel_h, kernel_h, [1.0], kernel_t))
end

Затем я определил функцию для применения этого ядра в качестве фильтра и возврата отфильтрованного массива.

function filter_array(array,window_x,window_t)
        filtered = imfilter(array, kernel4d_2(window_x,window_t))
end   

Это позволяет фильтровать массив следующим образом:

filtered = filter_array(unfiltered,window_x,window_t)
0 голосов
/ 15 ноября 2018

не совсем знаком с matlab, угадайте, что это скользящее среднее?

тогда оно линейное, и для выполнения movemean (movemean (movemean ...

вы можете вычислитьвместо этого уравнение , например

(3 * массив [текущий] + 3 * массив [текущий-1] + 2 * массив [текущий-2]) / 8

и пройти через массив

...