否定haskell中的矩阵?

时间:2011-11-27 21:08:38

标签: haskell

如果我使用vector包,我怎样才能得到矩阵的负数?只是“缩小”它不起作用。

所以来自:

 1 2 3
 3 4 5
 6 7 8

我想得到:

 -1 -2 -3
 -3 -4 -5
 -6 -7 -8

不,乘以-1也不起作用:

let m = fromList [[10,20,30], [11,12, 13]]
Prelude Data.Vector> :t m
m :: Vector [Integer]
Prelude Data.Vector> (-1)*m


<interactive>:1:3:
    No instance for (Num (Vector [Integer]))
      arising from the literal `1'
    Possible fix:
      add an instance declaration for (Num (Vector [Integer]))
    In the expression: 1
    In the first argument of `(*)', namely `(- 1)'
    In the expression: (- 1) * m

2 个答案:

答案 0 :(得分:11)

我认为你对矢量库的目的感到困惑。它的描述是:

  

Int-indexed数组(可变和不可变)的高效实现,具有强大的循环优化框架。

所以它只是一个数组类 - 如果你想对它执行矩阵运算,你必须自己编写解决方案。

您真正想要的是使用真正的矩阵库。 hmatrix是一个执行此操作的库。首先使用hmatrix installation instructions安装它。

这是您使用hmatrix编写程序的方式:

> import Data.Packed.Matrix
> let matrix = (3><3)[1,2,3,3,4,5,6,7,8]
> mapMatrix negate matrix
(3><3)
 [ -1.0, -2.0, -3.0
 , -3.0, -4.0, -5.0
 , -6.0, -7.0, -8.0 ]

库中有大量矩阵运算,只需阅读Data.Packed.MatrixNumeric.Container文档

答案 1 :(得分:4)

您是否尝试过Data.Vector.map (* (-1))


对于定义为m :: Vector [Integer]的矩阵,即整数列表的Data.Vector.Vector,您可以

Data.Vector.map (Prelude.map negate) m

外部map在向量上映射函数(Prelude.map negate)。内部map否定了列表中的所有元素。