2017-12-23 3 views
1

선형을위한 documentation은 V1, V2, V3, V4 함수를 사용하여 벡터 및 행렬을 만들어 1,2,3,4 차원의 벡터를 만드는 방법을 보여줍니다. 하지만 더 많은 요소를 가진 행렬을 사용하고 싶습니다.하스켈에서 선형 라이브러리로 행렬을 만드는 방법

매트릭스 곱셈 example은 함수 fromList을 사용하고 예제를 보여줍니다.

V2 (fromList [(1,2)]) (fromList [(2,3)]) !*! fromList [(1,V3 0 0 1), (2, V3 0 0 5)] 

그러나 선형 라이브러리에서이 기능을 찾을 수 없습니다. 임의의 크기 (예 : 5x6)의 double 값 행렬을 만들려면 어떻게해야합니까?

답변

2

(!*!)의 유형

(!*!) :: (Functor m, Foldable t, Additive t, Additive n, Num a) 
     => m (t a) -> t (n a) -> m (n a) 

중요한 제약 조건이 여기 Additive이기 때문에, 그래서 당신은 그냥 중첩 된 목록을 사용할 수의 인스턴스

instance Additive [] 
instance Additive Vector -- ordinary, unsized vectors from the vectors package 
instance Additive V0 
instance Additive V1 
instance Additive V2 
instance Additive V3 
instance Additive V4 -- Sized vectors from linear up to n = 4 
instance Dim n => Additive (V n) -- Vectors of arbitrary dimension where the size is given by a type level number n 
-- plus other instances 

을 살펴에서 :

m :: [[Int]] 
m = [ [ 0,1,2,3,4 ], 
     [ 1,2,3,4,0 ], 
     [ 2,3,4,0,1 ], 
     [ 3,4,0,1,2 ], 
     [ 4,0,1,2,3 ] ] 

msq :: [[Int]] 
msq = m !*! m 

또는 중첩 Vectors

import Data.Vector(Vector) 
import qualified Data.Vector as V 

mv :: Vector (Vector Int) 
mv = V.fromList $ V.fromList <$> m 

mvsq :: Vector (Vector Int) 
mvsq = mv !*! mv 

또는 믹스 앤 매치 :

mvl :: Vector [Int] 
mvl = V.fromList m 
mlv :: [Vector Int] 
mlv = V.fromList <$> m 

mvlmlv :: Vector (Vector Int) 
mvlmlv = mvl !*! mlv 

그리고 당신은 크기의 트랙을 유지하기 위해 V를 사용할 수 있습니다

{-# LANGUAGE DataKinds #-} 
import Linear.V 

mV :: V 5 (V 5 Int) -- GHC.TypeLits.Nat literals 
mV = fromJust $ fromVector $ fromJust <$> fromVector <$> mv 
mVsq :: V 5 (V 5 Int) 
mVsq = mV !*! mV -- does not compile in case of dimension mismatch 
관련 문제