【问题标题】:Row-normalize a sparse matrix into zero mean in Matlab在Matlab中将稀疏矩阵行归一化为零均值
【发布时间】:2012-09-06 01:17:03
【问题描述】:

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

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

【问题讨论】:

    标签: matlab sparse-matrix normalize bsxfun


    【解决方案1】:

    简单,轻松。

    随机稀疏矩阵。

    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] = find(A);应该是 [i,j,a] = find(A);我说的对吗?
    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2014-03-19
    • 2021-06-16
    • 2017-10-03
    • 1970-01-01
    • 2017-06-07
    • 2018-01-19
    相关资源
    最近更新 更多