Matlab中稀疏矩阵的行归一化为零均值

Matlab中稀疏矩阵的行归一化为零均值,matlab,sparse-matrix,normalize,bsxfun,Matlab,Sparse Matrix,Normalize,Bsxfun,我有一个大的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,

我有一个大的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结合起来,但没有成功

有人有矢量化的解决方案吗

放松点,小豌豆

随机稀疏矩阵

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的结果

spy(B)

[i,j.a]=查找(a);应该是[i,j,a]=find(a);我说得对吗?