问题部分:
NaN
s?有一个包含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
答案 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
函数以利用这些工具。