在MATLAB中,通过向量元素缩放稀疏矩阵中的每一行
我有一个稀疏矩阵在MATLAB中,通过向量元素缩放稀疏矩阵中的每一行,matlab,matrix,sparse-matrix,Matlab,Matrix,Sparse Matrix,我有一个稀疏矩阵 obj.resOp = sparse(row,col,val); % Random sparse matrix: 10 rows, 4 cols, density 20% S = sprand(10,4, 0.2); 和一个向量,包含矩阵中每行的和 sums = sparse(sum(obj.resOp,2)); 现在我想做的是 obj.resOp = obj.resOp ./ sums; 这将缩放矩阵中的每一行,使每一行的行和为1 然而,在最后一行中,MATLAB内
obj.resOp = sparse(row,col,val);
% Random sparse matrix: 10 rows, 4 cols, density 20%
S = sprand(10,4, 0.2);
和一个向量,包含矩阵中每行的和
sums = sparse(sum(obj.resOp,2));
现在我想做的是
obj.resOp = obj.resOp ./ sums;
这将缩放矩阵中的每一行,使每一行的行和为1
然而,在最后一行中,MATLAB内部似乎从obj.resOp
构建了一个完整的矩阵,因此我得到了以下错误:
使用./Requested 38849x231827(17.5GB)数组时出错超过最大值
数组大小首选项。可能会创建大于此限制的数组
需要很长时间,并导致MATLAB变得无响应。请参阅数组大小限制或首选项
有关更多信息,请参阅面板
对于足够大的矩阵
理论上,我认为扩展到一个完整的矩阵是没有必要的。在保持
obj.resOp
的稀疏性的同时,是否有我想要实现的任何MATLAB公式?您可以使用类似的方法来实现这一点
从一些稀疏矩阵开始
obj.resOp = sparse(row,col,val);
% Random sparse matrix: 10 rows, 4 cols, density 20%
S = sprand(10,4, 0.2);
获取行和,注意sum
从稀疏输入返回一个稀疏矩阵,因此不需要额外的转换()
查找所有非零索引及其值
[rowidx, colidx, vals] = find(S)
现在从元素分割创建一个稀疏矩阵
out = sparse(rowidx, colidx, vals./rowsums(rowidx), size(S,1), size(S,2));
等效计算
obj.resOp = inv(diag(sums)) * obj.resOp;
运行平稳。可能需要知道您使用的是哪个版本的MATLAB?我使用的是MATLAB 2017a.obj.resOp=inv(diag(sums))*obj.resOp;应该给我同样的结果,但是被杀了。这可能是我的向量中的一个错误。
sum
中的一些条目为零,这就是上面的方法不起作用的原因。修复后,一切正常!无论如何,谢谢你的建议,@wolfie除非绝对必要,否则无论如何都不要使用inv
。众所周知,它容易出错。因为你在寻找一个对角矩阵的逆矩阵,结果就是另一个对角矩阵,它的系数是逆矩阵。因此:inv(diag(sums))-->diag(1./sums)
。这篇文章是作者写的。谢谢你的提示。已实现。此解决方案确实比我的解决方案快,并且不太容易出现内存不足的情况。很高兴我能提供帮助,该方法对我来说太新了,以至于我不知道它能很好地工作