如何用稀疏向量替换稀疏矩阵指定列?Haskell实现求助
解决方案
方法1:基于现有sparse-linear-algebra库手动实现
完全可行,你可以通过过滤原矩阵目标列的元素,再将稀疏向量转换为矩阵三元组格式,合并后重新构建矩阵。代码实现如下:
import Data.Sparse.SpMatrix import Data.Sparse.SpVector import Numeric.LinearAlgebra.Sparse main :: IO () main = do let m1 = fromListSM (3,3) [(0,0,1) ,(1,1,2) ,(2,2,3) ] :: SpMatrix Double v = fromListSV 3 [(0,1),(1,4),(2,9)] :: SpVector Double targetCol = 1 -- 目标列是第2列,Haskell索引从0开始 -- 过滤原矩阵中不属于目标列的元素 filteredElems = filter (\(r, c, _) -> c /= targetCol) (toListSM m1) -- 将稀疏向量转为矩阵三元组格式(行索引, 目标列, 值) vecElems = map (\(r, val) -> (r, targetCol, val)) (toListSV v) -- 合并元素并构建新矩阵 m2 = fromListSM (rowsSM m1, colsSM m1) (filteredElems ++ vecElems) print m2
核心逻辑:
- 用
toListSM将原矩阵转为三元组列表,过滤掉目标列的所有元素 - 用
toListSV将稀疏向量转为(行索引, 值)列表,再适配成矩阵的三元组格式 - 合并两组元素,重新调用
fromListSM生成替换后的矩阵
方法2:更换为hmatrix-sparse库(更简洁)
如果允许更换依赖库,hmatrix-sparse提供了直接的列替换接口,无需手动处理元素。首先在你的Cabal配置中添加依赖:
build-depends: base >= 4.14 && < 5, hmatrix-sparse >= 0.1.0.0
然后代码可以简化为:
import Numeric.LinearAlgebra.Sparse main :: IO () main = do let m1 = fromLists (3,3) [[1,0,0] ,[0,2,0] ,[0,0,3] ] :: SparseMatrix Double v = fromList [1,4,9] :: SparseVector Double m2 = setColumn 1 v m1 -- 直接替换索引为1的列(对应第2列) print m2
内容的提问来源于stack exchange,提问作者Pompan
相关产品推荐
相关产品推荐

