我有一个大的m * n稀疏矩阵Y.我想规范化Y的每一行,这样每行的均值为零。
我第一次试过这个。但是每行的平均值也从零条目中减去,这不是我想要的。
Ynorm = bsxfun(@minus, Y, Ymean);
然后我试了一下。
[m, n] = size(Y);
nonZeroNum = nnz(Y);
Ynorm = spalloc(m,n,nonZeroNum);
for i = 1:m
Ynorm(i, :) = spfun(@(x)(x - Ymean(i)), Y(i, :));
end
然而,这种非矢量化解决方案太慢了。
我还想过将bsxfun和spfun结合起来,但没有成功。
有没有人有矢量化解决方案?
答案 0 :(得分:3)
轻松,轻松。
随机稀疏矩阵。
A = sprand(100,100,.05);
获取行意味着。如果一行中没有非零元素,我们将期望0/0 = NaN,但是下一步将永远不会触及该行。
rowmeans = sum(A,2)./sum(A~=0,2);
提取非零值。
[i,j.a] = find(A);
恢复数组,减去平均数。
[n,m] = size(A);
B = sparse(i,j,a - rowmeans(i),n,m);
现在,测试一下。不要忘记浮点运算在这里适用,因此行的平均值不会精确为零,只有eps的顺序。
min(mean(B,2))
ans =
(1,1) -1.5543e-17
max(mean(B,2))
ans =
(1,1) 1.1657e-17
似乎正确,完全矢量化。为了说服你结果真的是稀疏的并且零元素没有被破坏,这是间谍的结果。
spy(B)