Scala Breeze中能否删除矩阵的行或列?
当然可以在Scala Breeze里实现矩阵行/列的删除操作!和Matlab直接把目标行列设为空的方式不同,Breeze因为对矩阵维度有严格的类型约束,不能直接这么干,得通过筛选保留的行列索引来构造新矩阵,我给你举几个实用的例子:
首先我们先定义一个测试用的3x3矩阵:
import breeze.linalg._ val mat = DenseMatrix((1,2,3), (4,5,6), (7,8,9))
删除行操作
删除单行
比如要删除索引为1的行(Breeze是0-based索引,也就是矩阵的第二行),你可以生成排除目标行的索引序列,再用这个序列去切片矩阵:
// 生成保留的行索引:0和2 val keepRows = 0 until mat.rows filter (_ != 1) val matWithoutRow1 = mat(keepRows, ::) // 或者直接指定要保留的行索引数组 val matWithoutRow1 = mat(Array(0,2), ::)
删除多行
如果要删除多个行,比如索引0和2的行,同样用筛选索引的方式:
// 只保留索引为1的行 val keepRows = 0 until mat.rows filter (i => !(i == 0 || i == 2)) val matWithoutRows0And2 = mat(keepRows, ::) // 或者直接写保留的行索引 val matWithoutRows0And2 = mat(Array(1), ::)
删除列操作
思路和删除行完全一致,只是把操作对象换成列索引:
删除单列
比如删除索引为1的列(第二列):
val keepCols = 0 until mat.cols filter (_ != 1) val matWithoutCol1 = mat(::, keepCols) // 或者直接指定保留的列索引 val matWithoutCol1 = mat(::, Array(0,2))
删除多列
要删除索引0和2的列:
val keepCols = 0 until mat.cols filter (i => !(i == 0 || i == 2)) val matWithoutCols0And2 = mat(::, keepCols)
本质上这些操作都是通过选取需要保留的元素来创建新矩阵,因为Breeze的原始矩阵维度不可动态修改,所以不能直接在原矩阵上删除行列,必须生成新的矩阵对象。
内容的提问来源于stack exchange,提问作者user25470
相关产品推荐
相关产品推荐

