滑动窗口矩阵相关的中值

时间:2013-08-19 17:00:03

标签: median sliding-window julia

问题部分:

  1. 是否有“julia方式”来实现滑动窗口?
  2. julia需要忽略NaN s?
  3. 有一个包含264个记录点(行)和200个时间点(列)的矩阵。我希望在10个样本窗口中得到每个记录点与每个其他点的中值相关性。

    我通过创建一个3d 264x264x10矩阵尝试了这个matlab-way(tm),其中第三个dim是该窗口的相关性。在matlab中,我会像julia那样做median(cors,3) mean(cors,3)。但中位数并不支持这一点。看起来mapslices(median,cors,3)可能是我想要的,但有些记录点有NaN。在R中,我可能会查看na.omit()或函数选项,例如na.ignore=T但是我没有看到julia。

    #oned=readdlm("10152_20111123_preproc_torque.1D")
    oned=rand(200,264); oned[:,3]=NaN; oned[:,200]=NaN
    windows=10
    samplesPerWindow=size(oned,1)/windows
    cors=zeros(size(oned,2),size(oned,2),windows)
    for i=1:windows
     startat=(i-1)*windows+1
     endat=i*windows
     corofsamples=cor(oned[startat:i*windows,:])
     cors[:,:,i]= corofsamples
    end
    med = mapslices(median,cors,3) # fail b/c NaN
    

1 个答案:

答案 0 :(得分:2)

这是一种方法,它使用函数来封装任务的各个部分。通过创建忽略NaN的中值函数的专用版本,使用mapslices更容易:

function findcors(oned, windows)
    samplesPerWindow = size(oned, 1) / windows

    cors = zeros(size(oned, 2), size(oned, 2), windows)

    for i = 1:windows
        startat = (i - 1) * samplesPerWindow + 1
        endat = i * samplesPerWindow
        corofsamples = cor(oned[startat:endat, :])
        cors[:, :, i] = corofsamples
    end

    return cors
end

function nanmedian(A)
    cleanA = A[isfinite(A)]
    if isempty(cleanA)
        NaN
    else
        return median(cleanA)
    end
end

oned = rand(200, 264)
oned[:, 3] = NaN
oned[:, 200] = NaN

cors = findcors(oned, 10)

med = mapslices(nanmedian, cors, 3)

我相信您的原始代码在主循环中使用了错误的窗口长度。希望我已经解决了这个问题。

DataFrames包提供NA值和工具来忽略NA,但仍需要清理其median函数以利用这些工具。