2

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

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

其中数组是 (256,256,80,600) 浮点数组。为此,我正在尝试这条线:

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

但是,这会导致 TB 的分配,最终会占用我所有的内存并花费很长时间。matlab 线工作得很好,与我的 julia 线相比,使用的时间微不足道,这表明我正在以非最佳方式做某事。

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

4

2 回答 2

1

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

然后它是线性的,并且做 movemean(movemean(movemean...

你可以计算一个方程,比如

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

并通过数组

于 2018-11-15T10:18:31.100 回答
1

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

使用 factores 内核的不同之处在于,每个过滤器将单独应用,这将操作数从

窗口_h x 窗口_h x 窗口_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)
于 2018-11-28T22:39:52.933 回答