代码之家  ›  专栏  ›  技术社区  ›  Arvid Terzibaschian

在matlab中高效缩放稀疏矩阵的列

  •  1
  • Arvid Terzibaschian  · 技术社区  · 9 年前

    我有一个样本X,它是一个稀疏矩阵(约5%),现在尝试用一个因子缩放每一列(基本上是tf-idf归一化)。

    我认为这是一项很容易完成的任务,但现在却没有得到真正的支持。以下是我使用的:

    fac = log(size(X,1)./max(1,sum(X ~= 0)));
    X = bsxfun(@times,X,fac); % this line gives an out of memory error
    

    X约为20000x1000000,但只有约5%的功能是非零的,因此在内存方面不会有任何问题(该机器有48 GB内存,可以轻松处理分配相同数量元素的完整矩阵)。

    实际上,我觉得必须有一种简单的方法来实现这一点,因为这是一种非常常见的操作,稀疏矩阵保存数据样本。

    提前感谢

    2 回复  |  直到 9 年前
        1
  •  2
  •   knedlsepp    9 年前

    是的,线性代数!列缩放是对角矩阵的右乘法:

    X = X*diag(sparse(fac));
    
        2
  •  0
  •   Luis Mendo    9 年前

    也许可以这样做:

    1. 找到非零值,并记下每个值的列索引:
    2. 将每个值除以 fac 并将结果放入 X :

    代码:

    fac = log(size(X,1)./max(1,sum(X ~= 0)));   %// compute normalization vector
    [~,  col, val] = find(X);                   %// step 1
    X(X~=0) = val.*fac(col).';                 %'// step 2