2

我正在尝试计算具有许多 nan 值的 5000 行向量的 zscore。我必须计算很多次,所以我不想使用循环,我希望找到一个矢量化的解决方案。

循环解决方案:

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,然后在单词之后插入缺失的数据。我必须这样做 100 次,因此我正在寻找一种快速矢量化方法。

4

4 回答 4

1

这是一个矢量化解决方案:

% 用 s 生成一些示例数据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 分数),并且具有原始测量数据中的值NaNNaNval

于 2012-06-14T06:18:48.293 回答
1

抱歉,这个答案晚了 6 个月,但对于遇到此线程的其他人:

接受的答案并没有完全矢量化,因为它没有做真实zscore做的那么漂亮:也就是说,沿着矩阵的特定维度做 zscores。

如果你想一次计算大量向量的 zscores,就像 OP 所说的那样,最好的解决方案是:

Z = bsxfun(@divide, bsxfun(@minus, X, nanmean(X)) , 
                   nanstd(X) );

要在任意维度上执行此操作,只需将维度放在nanmeanandnanstd中,其余的由 bsxfun 处理。

nanzscore = @(X,DIM) bsxfun(@divide, bsxfun(@minus, X, nanmean(X,DIM)), ...
                                     nanstd(X,DIM));
于 2013-01-30T19:15:44.883 回答
0

匿名函数:

nanZ = @(xIn)(xIn-nanmean(xIn))/nanstd(xIn);

nanZ(vectorWithNans)

于 2013-04-23T21:44:58.620 回答
0

以下匿名函数的矢量化版本(假设观察在行中,变量在列中):

nanZ = @(xIn)(xIn-repmat(nanmean(xIn),size(xIn,1),1))./repmat(nanstd(xIn),size(xIn,1),1);
nanZ(matrixWithNans)
于 2014-04-11T17:11:03.317 回答