我试图计算zscore为5000行的载体,它有许多NaN值。 我计算过很多次,所以我不想使用一个循环,我希望能找到一个解决方案矢量。
循环解决方案:
for i = 1:end
vec(i,1) = (val(i,1) - nanmean(:,1))/nanstd(:,1)
end
部分矢量溶液:
zscore(vec(find(isnan(vec(1:end) == 0))))
但是这将返回一个向量的原始矢量减去NaN值的长度。 因此,它是不一样的原始大小。
我想计算的zscore为载体,进行插值话后丢失的数据。 我必须做的时候,这100S因此,我要寻找一个快速的量化方法。
这是一个矢量化的解决方案:
%生成与一些示例性数据NaN
秒。
val = reshape(magic(4), 16, 1);
val(10) = NaN;
val(17) = NaN;
下面的代码:
valWithoutNaNs = val(~isnan(val));
valMean = mean(valWithoutNaNs);
valSD = std(valWithoutNaNs);
valZscore = (val-valMean)/valSD;
然后列向量valZscore
包含偏差(Z值),并且具有NaN
对值NaN
在值val
,原始测量数据。
对不起这个答案为6月中下旬,但对于其他人谁遇到这个线程:
接受的答案是不完全矢量化,它没有做真正的什么zscore
确实如此美妙:也就是说,做zscores沿着矩阵的特定维度。
如果你想在一次计算的大量矢量的zscores,作为OP说,他是干什么的,最好的解决办法是这样的:
Z = bsxfun(@divide, bsxfun(@minus, X, nanmean(X)) ,
nanstd(X) );
要做到这一点上的任意尺寸,只是把里面的尺寸nanmean
和nanstd
,并bsxfun负责剩下的照顾。
nanzscore = @(X,DIM) bsxfun(@divide, bsxfun(@minus, X, nanmean(X,DIM)), ...
nanstd(X,DIM));
匿名函数:
nanZ = @(xIn)(xIn-nanmean(xIn))/nanstd(xIn);
nanZ(vectorWithNans)
以下匿名函数矢量版本(假设观测行,列变量):
nanZ = @(xIn)(xIn-repmat(nanmean(xIn),size(xIn,1),1))./repmat(nanstd(xIn),size(xIn,1),1);
nanZ(matrixWithNans)