Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中,通过向量元素缩放稀疏矩阵中的每一行_Matlab_Matrix_Sparse Matrix - Fatal编程技术网

在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)
。这篇文章是作者写的。谢谢你的提示。已实现。此解决方案确实比我的解决方案快,并且不太容易出现内存不足的情况。很高兴我能提供帮助,该方法对我来说太新了,以至于我不知道它能很好地工作