计算具有Nan值的矩阵中每对列之间的相关性的有效方法?

时间:2017-09-29 01:05:54

标签: matlab performance matrix nan correlation

假设我有n - by - m矩阵X,我希望获得m - by - m相关矩阵{{ 1}},其中每个元素Y ij 是i th 列和j th 列之间的相关性。 但是,Y矩阵在随机位置包含许多X值。 直接双循环方法是:

NaN

但这太慢了。有没有更有效的方法?

1 个答案:

答案 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