使用Breeze统计稀疏矩阵CSCMatrix每行的非零元素个数
方案1:小矩阵快速实现
如果你的矩阵规模不大,可以直接用Breeze内置的countNonZero算子逐行统计非零元素:
import breeze.linalg.{CSCMatrix, DenseVector, countNonZero} val matrix = CSCMatrix.tabulate(3, 2)((x,y) => x*y) val rowNonZeroCount = DenseVector.tabulate(matrix.rows) { rowId => countNonZero(matrix(rowId, ::)) }
输出结果为DenseVector(0, 1, 1),完全符合你的预期。
方案2:大矩阵高性能实现
CSCMatrix是列优先存储的稀疏矩阵,逐行取切片会产生额外开销,如果你的矩阵规模较大,可以直接操作其底层存储数组实现统计,时间复杂度仅为O(nnz)(nnz为矩阵非零元素总数),性能提升非常明显:
import breeze.linalg.{CSCMatrix, DenseVector} val matrix = CSCMatrix.tabulate(3, 2)((x,y) => x*y) // 初始化行计数数组 val countArr = new Array[Int](matrix.rows) // 遍历所有非零元素的行索引,对应行计数累加 matrix.rowIndices.foreach(row => countArr(row) += 1) // 转换为Breeze向量(无需的话也可以直接用Array) val rowNonZeroCount = DenseVector(countArr)
该方案输出结果和方案1完全一致,且不需要遍历矩阵的零元素,适合生产环境处理大规模稀疏矩阵。
内容的提问来源于stack exchange,提问作者Skyris
相关产品推荐
相关产品推荐

