如何在haskell中添加两个矩阵

时间:2015-06-24 23:28:25

标签: haskell matrix linear-algebra hmatrix

我正在尝试使用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人去哪儿了?

1 个答案:

答案 0 :(得分:4)

问题源于类型签名的差异。

var PORT = 6024;
var MULTICAST_ADDR = '239.255.255.250';
var dgram = require('dgram');
var client = dgram.createSocket('udp4');

client.on('listening', function () {
    var address = client.address();
    console.log('UDP Client listening on ' + address.address + ":" + address.port);
});

client.on('message', function (message, rinfo) {
    console.log('Message from: ' + rinfo.address + ':' + rinfo.port + ' - ' + message);
});

client.bind(PORT, function () {
    client.addMembership(MULTICAST_ADDR);
});

所以实际上 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),因此您可以&# 39;打印它。

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

(+)

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

(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])的{​​{1}}实例有Num,所以我们需要Matrix(Container Matrix a, Num (Vector a)) => Num (Matrix a)实例。但是,您可以检查Vector a是否没有num声明。有效的替代方案:

Num