1

问题部分:

  1. 有没有“朱莉娅方式”来实现滑动窗口?
  2. Julia 需要什么来忽略NaNs?

有一个包含 264 个记录点(行)和 200 个时间点(列)的矩阵。我想在 10 个样本窗口中获得每个记录点与每个其他点的中值相关性。

我已经通过创建 3d 264x264x10 矩阵尝试了 matlab 方式(tm),其中第三个暗淡是该窗口的相关性。在 matlab 中,我会median(cors,3)像 julia 那样做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
4

1 回答 1

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功能以利用这些工具。

于 2013-08-20T12:31:25.050 回答