2013-08-19 110 views
1

问题部件的窗口中位数:滑动矩阵的相关

  1. 是否有“朱莉娅的方式”来实现滑动窗口?
  2. 茱莉亚需要什么来忽略NaN s?

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

我试过这个matlab方式(tm)通过创建一个3d 264x264x10矩阵,其中第三个dim是该窗口的相关性。在MATLAB中,我会做median(cors,3)非常喜欢朱莉娅可以做mean(cors,3)。但是中位数对此没有支持。它看起来像可能是我想要的,但某些记录点有NaN。在R,我可能会看na.omit()或功能选项,如na.ignore=T但我没有看到茱莉亚。

#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 

回答

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