2013-08-19 107 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函數以利用這些工具。