假设我有n
- by - m
矩阵X
,我希望获得m
- by - m
相关矩阵{{ 1}},其中每个元素Y ij 是i th 列和j th 列之间的相关性。
但是,Y
矩阵在随机位置包含许多X
值。
直接双循环方法是:
NaN
但这太慢了。有没有更有效的方法?
答案 0 :(得分:0)
这是使用矩阵乘法的矢量化解决方案:
function Y = cornan(X)
nans = isnan(X);
nnans=~nans;
X(nans)=0;
sX=nnans.'*X;
n=nnans.'*nnans;
sX2=X.'*X;
Y = (n.*sX2-sX.'.*sX)./sqrt((sX.^2-bsxfun(@times,n,diag(sX2).')).*(sX.'.^2-bsxfun(@times,n,diag(sX2))));
end
或从MATLAB R2016b / Octave开始,这可以更短:
function Y = cornan(X)
nans = isnan(X);
nnans=~nans;
X(nans)=0;
sX=nnans.'*X;
n=nnans.'*nnans;
sX2=X.'*X;
Y = (n.*sX2-sX.'.*sX)./sqrt((sX.^2-n.*diag(sX2).').*(sX.'.^2-n.*diag(sX2)));
end