我有一个稀疏矩阵
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表达式?
答案 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;
顺利运作。