>>> dot
(strat1 `dot` strat2) `dot` strat3 == strat1 `dot` (strat2 `dot` strat3) strat1 `dot` strat1 = strat1 strat1 `dot` r0 == strat1
strat2 `dot` strat1 == strat2 . withStrategy strat1
>>> V2 1 2 `dot` V2 3 4 11
forVector2 number_ $ \xs ys -> Vector.dot xs ys == Matrix.multiply (Matrix.singleRow xs) (Matrix.singleColumn ys) ! ((),())
QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.dot (Vector.unit (shapeInt dim) i) (Vector.unit (shapeInt dim) j) == (fromIntegral (fromEnum (i==j)) :: Number_)
>>> pretty $ dot sum (*) m (transpose m) [[5,14], [14,50]]inner product
>>> pretty $ dot sum (*) v v 5matrix-vector multiplication Note that an Array with shape [3] is neither a row vector nor column vector.
>>> pretty $ dot sum (*) v (transpose m) [5,14]
>>> pretty $ dot sum (*) m v [5,14]
>>> pretty $ dot sum (*) m (transpose m) [[5,14], [14,50]]inner product
>>> pretty $ dot sum (*) v v 5matrix-vector multiplication Note that an Array with shape [3] is neither a row vector nor column vector.
>>> pretty $ dot sum (*) v (transpose m) [5,14]
>>> pretty $ dot sum (*) m v [5,14]
>>> let b = fromFlatList [2,3] [1..6] :: Array Int >>> dot sum (*) b (transpose b) [[14, 32], [32, 77]]inner product
>>> let v = fromFlatList [3] [1..3] :: Array Int >>> dot sum (*) v v 14matrix-vector multiplication Note that an `Array Int` with shape [3] is neither a row vector nor column vector. dot is not turning the vector into a matrix and then using matrix multiplication.
>>> dot sum (*) v b [9, 12, 15]
>>> dot sum (*) b v [14, 32]
>>> let b = [1..6] :: Array '[2,3] Int >>> dot sum (*) b (transpose b) [[14, 32], [32, 77]]inner product
>>> let v = [1..3] :: Array '[3] Int >>> :t dot sum (*) v v dot sum (*) v v :: Array '[] Int
>>> dot sum (*) v v 14matrix-vector multiplication (Note how the vector doesn't need to be converted to a row or column vector)
>>> dot sum (*) v b [9, 12, 15]
>>> dot sum (*) b v [14, 32]Array elements don't have to be numbers:
>>> x1 = (show <$> [1..4]) :: Array '[2,2] String >>> x2 = (show <$> [5..8]) :: Array '[2,2] String >>> x1 [["1", "2"], ["3", "4"]]
>>> x2 [["5", "6"], ["7", "8"]]
>>> import Data.List (intercalate) >>> dot (intercalate "+" . toList) (\a b -> a <> "*" <> b) x1 x2 [["1*5+2*7", "1*6+2*8"], ["3*5+4*7", "3*6+4*8"]]dot allows operation on mis-shaped matrices. The algorithm ignores excess positions within the contracting dimension(s):
>>> let m23 = [1..6] :: Array '[2,3] Int >>> let m12 = [1,2] :: Array '[1,2] Int >>> shape $ dot sum (*) m23 m12 [2,2]Find instances of a vector in a matrix
>>> let cs = fromList ("abacbaab" :: [Char]) :: Array '[4,2] Char >>> let v = fromList ("ab" :: [Char]) :: Vector 2 Char >>> dot (all id) (==) cs v [True, False, False, True]