朱莉娅等于movmean(array,window,dims)吗?

时间:2018-11-15 08:42:56

标签: julia

我在Linux机器上使用julia 0.7.0,NCDatasets.jl和Images.jl来分析约80GB的数据集。我没有加载很多变量,第一步是做等效于matlab的

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

其中array是(256,256,80,600)浮点数组。为此,我正在尝试以下行:

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

但是,这将导致数TB的分配,这最终将占用我的所有内存并占用很多时间。与我的julia系列产品相比,matlab系列产品可以很好地工作并且花费的时间很少,这表明我在以非最佳方式进行操作。

有人可以提供任何见解吗?

2 个答案:

答案 0 :(得分:1)

对matlab不太熟悉,猜猜它是移动平均线吗?

然后是线性的,然后执行movemean(movemean(movemean ...

您可以 计算方程式 ,例如

(3 * array [current] + 3 * array [current-1] + 2 * array [current-2])/ 8

并遍历数组

答案 1 :(得分:1)

根据Julia discourse的讨论,回答我自己的问题:我继续以以下方式使用Images包,尤其是ImageFiltering。 首先,我定义用于平滑的内核。 该内核将通过计算它与我们正在过滤的数组之间的相关性来使用。

使用阶乘内核的区别在于,每个过滤器将单独应用,这将改变操作数。

window_h x window_h x window_t

window_h + window_h + window_t

docs中所述。

请注意,内核在第三维中使用[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)