matlab - 在 MATLAB 中按向量的元素缩放稀疏矩阵中的每一行

标签 matlab matrix sparse-matrix

我有一个稀疏矩阵

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

以及一个包含矩阵中每行之和的向量

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

现在我想做的是

obj.resOp = obj.resOp ./ sums;

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

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

Error using ./ Requested 38849x231827 (17.5GB) array exceeds maximum array size preference. Creation of arrays greater than this limit may take a long time and cause MATLAB to become unresponsive. See array size limit or preference panel for more information.

对于足够大的矩阵。

理论上我认为扩展到完整矩阵是没有必要的。在保持 obj.resOp 的稀疏性的同时,是否有任何 MATLAB 公式可以说明我想要实现的目标?

最佳答案

您可以使用类似于 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));

关于matlab - 在 MATLAB 中按向量的元素缩放稀疏矩阵中的每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47433051/

相关文章:

matlab - Matlab 绘图的自定义标记

c++ - 无效的 MEX 文件 libmkl_rt.so : cannot open

python - 如何在二维数组中输入元素

c++ - Eigen :比较两个可能具有不同稀疏模式的稀疏矩阵

python - 如何在 SciPy 中创建对角稀疏矩阵

python - 如何在 Python 中对角化稀疏 csr 一维矩阵(向量)?

matlab - matlab中数组行的组合和乘法

当打印为 .eps 时,Matlab 提供光栅化图形而不是矢量图形

matlab - 从工作区到 Simulink 的异构数据

r - 创建三角矩阵