通过MATLAB中的向量元素缩放稀疏矩阵中的每一行

时间:2017-11-22 11:02:43

标签: matlab matrix sparse-matrix

我有一个稀疏矩阵

obj.resOp = sparse(row,col,val); 

和包含矩阵中每行总和的向量

sums = sparse(sum(obj.resOp,2));

现在我想做的是

obj.resOp = obj.resOp ./ sums;

将缩放矩阵中的每一行,以便每行中的rowsum为1。

然而在最后一行中,MATLAB内部似乎从obj.resOp构造了一个完整的矩阵,因此我得到了这个错误:

  

使用./请求的错误38849x231827(17.5GB)数组超出最大值   数组大小首选项。创建大于此限制的数组可能   花费很长时间并导致MATLAB无响应。请参阅数组大小限制或首选项   小组了解更多信息。

对于足够大的矩阵。

理论上我认为扩展到完整矩阵是没有必要的。在保持obj.resOp的稀疏性的情况下,是否有任何我希望实现的MATLAB表达式?

2 个答案:

答案 0 :(得分:2)

您可以使用与described in this answer类似的方法执行此操作。

从一些稀疏矩阵开始

% Random sparse matrix: 10 rows, 4 cols, density 20%
S = sprand(10,4, 0.2);

获取行总和,请注意sum从稀疏输入返回稀疏矩阵,因此无需进行额外转换(docs)。

rowsums = sum(S,2);

查找所有非零指数及其值

[rowidx, colidx, vals] = find(S)

现在从元素分割

创建一个稀疏矩阵
out = sparse(rowidx, colidx, vals./rowsums(rowidx), size(S,1), size(S,2));

答案 1 :(得分:0)

等效计算

obj.resOp = inv(diag(sums)) * obj.resOp;

顺利运作。