You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用稀疏向量替换稀疏矩阵指定列?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:42:12