如何在 haskell 中添加两个矩阵

how to add two matrices in haskell

我正在尝试使用 Haskell 的线性代数库来计算一些特征值,但首先我需要先尝试添加矩阵。

import Numeric.LinearAlgebra.Data
matrix 3 [1,2,3,4,5,6,7,8,9 ]  + matrix 3 [1,2,3,4,5,6,7,8,9 ] 

(3><3)
 [  2.0,  4.0,  6.0
 ,  8.0, 10.0, 12.0
 , 14.0, 16.0, 18.0 ]

但是,如果我尝试用另一种方式表示,我会收到错误消息

( 3 >< 3 ) [1,2,3,4,5,6,7,8,9 ]  + ( 3 >< 3 ) [1,2,3,4,5,6,7,8,9 ] 

No instance for (Element a0) arising from a use of ‘print’
The type variable ‘a0’ is ambiguous

我什至不确定 matrix 3 [1,2,3,4,5,6,7,8,9 ] 因为我想指定我想要一个 3 × 3 矩阵。另外3个人去哪了?

问题是由类型签名的差异引起的。

 matrix :: Int -> [ℝ] -> Matrix ℝ
 (><) :: Storable a => Int -> Int -> [a] -> Matrix a

所以实际上 matrix 3 [1,2,3,4,5,6,7,8,9 ] 的类型是 Matrix ℝ( 3 >< 3 ) [1,2,3,4,5,6,7,8,9 ] 的类型是 (Num a, Foreign.Storable.Storable a) => Matrix a。然后,问题突然变得容易处理了。在指定 a 是什么之前,您不知道 (+) 是什么,因此您实际上无法计算矩阵的总和(仅产生 thunk),因此您无法打印它。

快速解决方法是指定矩阵的类型

(3 >< 3) ([1..9] :: [ℝ])  + (3 >< 3) ([1..9] :: [ℝ])

哪些输出(给定正确的导入):

(3><3)
 [  2.0,  4.0,  6.0
 ,  8.0, 10.0, 12.0
 , 14.0, 16.0, 18.0 ]

一些奖金信息

我想做 (3 >< 3) ([1..9] :: [Integer]) + (3 >< 3) ([1..9] :: [Integer]),但请注意 MatrixNum 实例有 (Container Matrix a, Num (Vector a)) => Num (Matrix a) 所以我们需要 Vector a 也有一个 Num实例。但是,您可以检查 Vector Integer 是否没有 num 声明。可行的替代方案:

Num (Vector Double)  
Num (Vector Float)   
Num (Vector (Complex Double))    
Num (Vector (Complex Float))