如何在 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])
,但请注意 Matrix
的 Num
实例有 (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))
我正在尝试使用 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])
,但请注意 Matrix
的 Num
实例有 (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))