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

matlab中稀疏矩阵列的高效缩放,matlab,matrix,out-of-memory,normalization,sparse-matrix,Matlab,Matrix,Out Of Memory,Normalization,Sparse Matrix,我有一个样本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大约为20000x1000,但只有约5%的功能是非零的,因此不会出现任何内存问题(机器有48

我有一个样本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大约为20000x1000,但只有约5%的功能是非零的,因此不会出现任何内存问题(机器有48 GB Ram,可以轻松处理分配相同数量元素的完整矩阵)

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


提前感谢

也许可以使用以下内容:

  • 找到非零值,并记下每个值的列索引:
  • 将每个值除以该列确定的
    fac
    条目,并将结果放入
    X
  • 代码:


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

    X = X*diag(sparse(fac));
    

    @ArvidTerzibaschian:Hm.我怀疑
    bsxfun
    不能处理稀疏矩阵,但事实并非如此(在我的MATLAB版本中)。以上内容似乎与
    bsxfun
    具有相同的内存开销。你确定你的矩阵实际上是一个稀疏矩阵吗?我刚检查过你是对的,是因为bsxfun太快了。矩阵是稀疏的,但不是预期的5%。@ArvidTerzibaschian:那么你是如何解决这个问题的呢?根据我的计算,可以轻松地处理具有相同条目数的完整矩阵:根据我的计算,这样大小的完整矩阵将使用150GB的RAM。不是条目数,我指的是实际内存使用情况,例如分配的元素数我不明白你的意思。一个完整的
    20000×1000000
    矩阵将占用150GB的内存。@knedlsepp我的意思是,稀疏矩阵只分配非零元素,因此一个具有相同数量分配元素的完整矩阵(不谈维数)应该适合内存。实际上,JIT编译器应该优化一些操作以就地操作:
    X = X*diag(sparse(fac));