diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,12 @@
 TYPES = Float Double ComplexFloat ComplexDouble
 TEST_MODULES = test/Test/Numeric/BLAS/Slice.hs \
-  $(patsubst %, test/Test/%/Numeric/BLAS/Vector.hs, $(TYPES)) \
-  $(patsubst %, test/Test/%/Numeric/BLAS/Vector/Slice.hs, $(TYPES))
+  $(patsubst %, test/Test/%/Main.hs, $(TYPES))
+TESTABLE = \
+  src/Numeric/BLAS/Vector.hs \
+  src/Numeric/BLAS/Vector/Slice.hs \
+  src/Numeric/BLAS/Matrix/RowMajor.hs
 
+
 run-test:	update-test
 	runhaskell Setup configure --user --enable-tests
 	runhaskell Setup build
@@ -14,10 +18,11 @@
 test/Test/Numeric/BLAS/Slice.hs: src/Numeric/BLAS/Slice.hs
 	doctest-extract-0.1 -i src/ -o test/ --module-prefix Test Numeric.BLAS.Slice
 
-test/Test/%/Numeric/BLAS/Vector.hs: src/Numeric/BLAS/Vector.hs
-	doctest-extract-0.1 -i src/ -o test/ --module-prefix Test.$* Numeric.BLAS.Vector
-	perl -i -p -e "s:NumberModule:$*:" $@
+test/Test/%/Main.hs:	test-module.list $(TESTABLE)
+	doctest-extract-0.1 -i src/ -o test/ --module-prefix Test.$* --library-main Main $$(cat test-module.list)
+	for file in $$(find test/Test/$*/Numeric -name "*.hs"); \
+	  do perl -i -p -e "s:NumberModule:$*:" $$file; \
+	done
 
-test/Test/%/Numeric/BLAS/Vector/Slice.hs: src/Numeric/BLAS/Vector/Slice.hs
-	doctest-extract-0.1 -i src/ -o test/ --module-prefix Test.$* Numeric.BLAS.Vector.Slice
-	perl -i -p -e "s:NumberModule:$*:" $@
+test-module.list:       comfort-blas.cabal
+	grep '^ \+Test\.Float\.Numeric\.BLAS\.' $< | cut -d. -f3- >$@
diff --git a/comfort-blas.cabal b/comfort-blas.cabal
--- a/comfort-blas.cabal
+++ b/comfort-blas.cabal
@@ -1,6 +1,6 @@
 Cabal-Version:    2.2
 Name:             comfort-blas
-Version:          0.0.2
+Version:          0.0.3
 License:          BSD-3-Clause
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -17,7 +17,7 @@
   Makefile
 
 Source-Repository this
-  Tag:         0.0.2
+  Tag:         0.0.3
   Type:        darcs
   Location:    https://hub.darcs.net/thielema/comfort-blas/
 
@@ -28,8 +28,8 @@
 Library
   Build-Depends:
     blas-ffi >=0.0 && <0.2,
-    netlib-ffi >=0.1.1 && <0.2,
-    comfort-array >=0.5.2 && <0.6,
+    netlib-ffi >=0.1.2 && <0.2,
+    comfort-array >=0.5.5 && <0.6,
     storablevector >=0.2 && <0.3,
     guarded-allocation >=0.0 && <0.1,
     non-empty >=0.3.1 && <0.4,
@@ -72,6 +72,10 @@
   Hs-Source-Dirs:   test
   Main-Is:          Main.hs
   Other-Modules:
+    Test.Float.Numeric.BLAS.Matrix.RowMajor
+    Test.Double.Numeric.BLAS.Matrix.RowMajor
+    Test.ComplexFloat.Numeric.BLAS.Matrix.RowMajor
+    Test.ComplexDouble.Numeric.BLAS.Matrix.RowMajor
     Test.Float.Numeric.BLAS.Vector.Slice
     Test.Double.Numeric.BLAS.Vector.Slice
     Test.ComplexFloat.Numeric.BLAS.Vector.Slice
@@ -84,6 +88,10 @@
     Test.Double.Type
     Test.ComplexFloat.Type
     Test.ComplexDouble.Type
+    Test.Float.Main
+    Test.Double.Main
+    Test.ComplexFloat.Main
+    Test.ComplexDouble.Main
     Test.Numeric.BLAS.Slice
     Test.Slice
     Test.Generator
diff --git a/src/Numeric/BLAS/Matrix/Layout.hs b/src/Numeric/BLAS/Matrix/Layout.hs
--- a/src/Numeric/BLAS/Matrix/Layout.hs
+++ b/src/Numeric/BLAS/Matrix/Layout.hs
@@ -1,21 +1,13 @@
-{-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE TypeOperators #-}
-module Numeric.BLAS.Matrix.Layout where
+module Numeric.BLAS.Matrix.Layout (
+   Order(..),
+   flipOrder,
+   transposeFromOrder,
+   ) where
 
-import Control.DeepSeq (NFData, rnf)
+import Numeric.Netlib.Layout (Order(..), flipOrder)
 
 
-data Order = RowMajor | ColumnMajor
-   deriving (Eq, Show)
-
-instance NFData Order where
-   rnf RowMajor = ()
-   rnf ColumnMajor = ()
-
-flipOrder :: Order -> Order
-flipOrder RowMajor = ColumnMajor
-flipOrder ColumnMajor = RowMajor
-
+{-# DEPRECATED transposeFromOrder "For internal use in package 'lapack'." #-}
 transposeFromOrder :: Order -> Char
 transposeFromOrder RowMajor = 'T'
 transposeFromOrder ColumnMajor = 'N'
diff --git a/src/Numeric/BLAS/Matrix/Modifier.hs b/src/Numeric/BLAS/Matrix/Modifier.hs
--- a/src/Numeric/BLAS/Matrix/Modifier.hs
+++ b/src/Numeric/BLAS/Matrix/Modifier.hs
@@ -1,49 +1,17 @@
-module Numeric.BLAS.Matrix.Modifier where
-
-import Numeric.BLAS.Matrix.Layout (Order(RowMajor,ColumnMajor), flipOrder)
-
-import Data.Monoid (Monoid, mempty, mappend)
-import Data.Semigroup (Semigroup, (<>))
-
-
-
-data Transposition = NonTransposed | Transposed
-   deriving (Eq, Show, Enum, Bounded)
-
-instance Semigroup Transposition where
-   x<>y = if x==y then NonTransposed else Transposed
-
-instance Monoid Transposition where
-   mempty = NonTransposed
-   mappend = (<>)
-
-transposeOrder :: Transposition -> Order -> Order
-transposeOrder NonTransposed = id
-transposeOrder Transposed = flipOrder
+module Numeric.BLAS.Matrix.Modifier (
+   Modi.Transposition(..),
+   Modi.transposeOrder,
+   Modi.Conjugation(..),
+   conjugatedOnRowMajor,
+   Modi.Inversion(..),
+   ) where
 
+import qualified Numeric.Netlib.Modifier as Modi
+import Numeric.Netlib.Modifier (Conjugation(NonConjugated, Conjugated))
+import Numeric.Netlib.Layout (Order(RowMajor,ColumnMajor))
 
 
-data Conjugation = NonConjugated | Conjugated
-   deriving (Eq, Show, Enum, Bounded)
-
-instance Semigroup Conjugation where
-   x<>y = if x==y then NonConjugated else Conjugated
-
-instance Monoid Conjugation where
-   mempty = NonConjugated
-   mappend = (<>)
-
+{-# DEPRECATED conjugatedOnRowMajor "For internal use in package 'lapack'." #-}
 conjugatedOnRowMajor :: Order -> Conjugation
 conjugatedOnRowMajor RowMajor = Conjugated
 conjugatedOnRowMajor ColumnMajor = NonConjugated
-
-
-data Inversion = NonInverted | Inverted
-   deriving (Eq, Show, Enum, Bounded)
-
-instance Semigroup Inversion where
-   x<>y = if x==y then NonInverted else Inverted
-
-instance Monoid Inversion where
-   mempty = NonInverted
-   mappend = (<>)
diff --git a/src/Numeric/BLAS/Matrix/RowMajor.hs b/src/Numeric/BLAS/Matrix/RowMajor.hs
--- a/src/Numeric/BLAS/Matrix/RowMajor.hs
+++ b/src/Numeric/BLAS/Matrix/RowMajor.hs
@@ -2,10 +2,19 @@
 {-# LANGUAGE TypeOperators #-}
 module Numeric.BLAS.Matrix.RowMajor (
    Matrix,
+   Square,
    Vector,
+   height, width,
+   Array2.singleRow, Array2.flattenRow,
+   Array2.singleColumn, Array2.flattenColumn,
+   identity,
    takeRow,
    takeColumn,
    fromRows,
+   above,
+   beside,
+   takeTop, takeBottom,
+   takeLeft, takeRight,
    tensorProduct,
    decomplex,
    recomplex,
@@ -13,9 +22,15 @@
    scaleColumns,
    multiplyVectorLeft,
    multiplyVectorRight,
+   Transposable(..), nonTransposed, transposed,
+   transposeTransposable,
+   multiply,
+   multiplyTransposable,
+   kronecker,
+   kroneckerTransposable,
+   kroneckerLeftTransposable,
    ) where
 
-import qualified Numeric.BLAS.Matrix.Modifier as Modifier
 import qualified Numeric.BLAS.Private as Private
 import Numeric.BLAS.Matrix.Modifier (Conjugation(NonConjugated,Conjugated))
 import Numeric.BLAS.Scalar (zero, one)
@@ -26,43 +41,134 @@
 import qualified Numeric.Netlib.Class as Class
 
 import Foreign.Marshal.Array (copyArray, advancePtr)
-import Foreign.ForeignPtr (withForeignPtr, castForeignPtr)
-import Foreign.Storable (Storable)
+import Foreign.ForeignPtr (ForeignPtr, withForeignPtr, castForeignPtr)
+import Foreign.Storable (Storable, poke)
 
 import Control.Monad.Trans.Cont (ContT(ContT), evalContT)
 import Control.Monad.IO.Class (liftIO)
+import Control.Applicative (liftA2)
 
 import qualified Data.Array.Comfort.Storable.Unchecked as Array
+import qualified Data.Array.Comfort.Storable.Dim2 as Array2
+import qualified Data.Array.Comfort.Shape.SubSize as SubSize
 import qualified Data.Array.Comfort.Shape as Shape
 import Data.Array.Comfort.Storable.Unchecked (Array(Array))
+import Data.Array.Comfort.Shape ((::+))
 
 import Data.Foldable (forM_)
 import Data.Complex (Complex)
 import Data.Tuple.HT (swap)
 
 
+{- $setup
+>>> import Test.NumberModule.Type (Number_)
+>>> import Test.NumberModule.Numeric.BLAS.Vector (forVector, genVector, number_)
+>>> import Test.Slice (ShapeInt, shapeInt)
+>>> import qualified Numeric.BLAS.Matrix.RowMajor as Matrix
+>>> import qualified Numeric.BLAS.Vector as Vector
+>>> import qualified Numeric.Netlib.Class as Class
+>>> import Numeric.BLAS.Scalar (RealOf)
+>>> import qualified Data.Array.Comfort.Storable as Array
+>>> import qualified Data.Array.Comfort.Shape as Shape
+>>> import qualified Test.QuickCheck as QC
+>>>
+>>> type Matrix = Matrix.Matrix (Shape.ZeroBased Int) (Shape.ZeroBased Int)
+>>> type Real_ = RealOf Number_
+>>>
+>>> maxDim :: Int
+>>> maxDim = 10
+>>>
+>>> forMatrix ::
+>>>    (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+>>>    QC.Gen a -> (Matrix a -> prop) -> QC.Property
+>>> forMatrix genElem =
+>>>    QC.forAll
+>>>       (do height <- fmap shapeInt $ QC.choose (0,maxDim)
+>>>           width <- fmap shapeInt $ QC.choose (0,maxDim)
+>>>           genVector (height, width) genElem)
+>>>
+>>> genIdentityTrans ::
+>>>    (Shape.C sh, Class.Floating a) =>
+>>>    sh -> QC.Gen (Matrix.Transposable sh sh a)
+>>> genIdentityTrans sh = do
+>>>    trans <- QC.arbitrary
+>>>    return $
+>>>       if trans
+>>>          then Matrix.transposed (Matrix.identity sh)
+>>>          else Matrix.nonTransposed (Matrix.identity sh)
+>>>
+>>> transpose ::
+>>>    (Shape.C height, Eq height, Shape.C width, Class.Floating a) =>
+>>>    Matrix.Matrix height width a -> Matrix.Matrix width height a
+>>> transpose a =
+>>>    Matrix.multiplyTransposable
+>>>       (Matrix.transposed a)
+>>>       (Matrix.nonTransposed (Matrix.identity (Matrix.height a)))
+-}
+
+
 type Matrix height width = Array (height,width)
+{- |
+There is also 'Shape.Square'
+but this would be incompatible with other matrix operations.
+This might be addressed in a new Matrix.Square module.
+But for advanced type hacks you can already use the @lapack@ package.
+-}
+type Square sh = Matrix sh sh
 type Vector = Array
 
+
+height :: Matrix height width a -> height
+height = fst . Array.shape
+
+width :: Matrix height width a -> width
+width = snd . Array.shape
+
+
+{- |
+>>> Matrix.identity (Shape.ZeroBased 0) :: Matrix.Square (Shape.ZeroBased Int) Real_
+StorableArray.fromList (ZeroBased {... 0},ZeroBased {... 0}) []
+>>> Matrix.identity (Shape.ZeroBased 3) :: Matrix.Square (Shape.ZeroBased Int) Real_
+StorableArray.fromList (ZeroBased {... 3},ZeroBased {... 3}) [1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0]
+-}
+identity :: (Shape.C sh, Class.Floating a) => sh -> Square sh a
+identity sh =
+   Array.unsafeCreateWithAutoSizes (sh,sh) $
+      \(SubSize.Sub blockSize (SubSize.Atom nint, SubSize.Atom _)) yPtr ->
+   evalContT $ do
+      nPtr <- Call.alloca
+      xPtr <- Call.number zero
+      incxPtr <- Call.cint 0
+      incyPtr <- Call.cint 1
+      liftIO $ do
+         poke nPtr $ fromIntegral blockSize
+         Blas.copy nPtr xPtr incxPtr yPtr incyPtr
+         let n = fromIntegral nint
+         poke nPtr n
+         poke xPtr one
+         poke incyPtr (n+1)
+         Blas.copy nPtr xPtr incxPtr yPtr incyPtr
+
+
 takeRow ::
    (Shape.Indexed height, Shape.C width, Shape.Index height ~ ix,
     Storable a) =>
    ix -> Matrix height width a -> Vector width a
-takeRow ix (Array (height,width) x) =
-   Array.unsafeCreateWithSize width $ \n yPtr ->
+takeRow ix (Array (height_,width_) x) =
+   Array.unsafeCreateWithSize width_ $ \n yPtr ->
    withForeignPtr x $ \xPtr ->
-      copyArray yPtr (advancePtr xPtr (n * Shape.offset height ix)) n
+      copyArray yPtr (advancePtr xPtr (n * Shape.offset height_ ix)) n
 
 takeColumn ::
    (Shape.C height, Shape.Indexed width, Shape.Index width ~ ix,
     Class.Floating a) =>
    ix -> Matrix height width a -> Vector height a
-takeColumn ix (Array (height,width) x) =
-   Array.unsafeCreateWithSize height $ \n yPtr -> evalContT $ do
-      let offset = Shape.offset width ix
+takeColumn ix (Array (height_,width_) x) =
+   Array.unsafeCreateWithSize height_ $ \n yPtr -> evalContT $ do
+      let offset = Shape.offset width_ ix
       nPtr <- Call.cint n
       xPtr <- ContT $ withForeignPtr x
-      incxPtr <- Call.cint $ Shape.size width
+      incxPtr <- Call.cint $ Shape.size width_
       incyPtr <- Call.cint 1
       liftIO $ Blas.copy nPtr (advancePtr xPtr offset) incxPtr yPtr incyPtr
 
@@ -70,27 +176,72 @@
 fromRows ::
    (Shape.C width, Eq width, Storable a) =>
    width -> [Vector width a] -> Matrix ShapeInt width a
-fromRows width rows =
-   Array.unsafeCreate (shapeInt $ length rows, width) $ \dstPtr ->
-   let widthSize = Shape.size width
-   in forM_ (zip (pointerSeq widthSize dstPtr) rows) $
+fromRows width_ rows =
+   Array.unsafeCreateWithAutoSizes (shapeInt $ length rows, width_) $
+         \(SubSize.Atom _, SubSize.Atom widthSize) dstPtr ->
+
+      forM_ (zip (pointerSeq widthSize dstPtr) rows) $
          \(dstRowPtr, Array.Array rowWidth srcFPtr) ->
          withForeignPtr srcFPtr $ \srcPtr -> do
             Call.assert
                "Matrix.fromRows: non-matching vector size"
-               (width == rowWidth)
+               (width_ == rowWidth)
             copyArray dstRowPtr srcPtr widthSize
 
+infixr 2 `above`
+infixr 3 `beside`
 
--- ToDo: use lapack:Private.multiplyMatrix
+above ::
+   (Shape.C heightA, Shape.C heightB) =>
+   (Shape.C width, Eq width) =>
+   (Storable a) =>
+   Matrix heightA width a ->
+   Matrix heightB width a ->
+   Matrix (heightA::+heightB) width a
+above = Array2.above
+
+beside ::
+   (Shape.C widthA, Shape.C widthB) =>
+   (Shape.C height, Eq height) =>
+   (Storable a) =>
+   Matrix height widthA a ->
+   Matrix height widthB a ->
+   Matrix height (widthA::+widthB) a
+beside = Array2.beside
+
+takeTop ::
+   (Shape.C heightA, Shape.C heightB, Shape.C width, Storable a) =>
+   Matrix (heightA::+heightB) width a ->
+   Matrix heightA width a
+takeTop = Array2.takeTop
+
+takeBottom ::
+   (Shape.C heightA, Shape.C heightB, Shape.C width, Storable a) =>
+   Matrix (heightA::+heightB) width a ->
+   Matrix heightB width a
+takeBottom = Array2.takeBottom
+
+takeLeft ::
+   (Shape.C height, Shape.C widthA, Shape.C widthB, Storable a) =>
+   Matrix height (widthA::+widthB) a ->
+   Matrix height widthA a
+takeLeft = Array2.takeLeft
+
+takeRight ::
+   (Shape.C height, Shape.C widthA, Shape.C widthB, Storable a) =>
+   Matrix height (widthA::+widthB) a ->
+   Matrix height widthB a
+takeRight = Array2.takeRight
+
+
+{-# WARNING tensorProduct "Don't use conjugation. Left and Right are swapped." #-}
 tensorProduct ::
    (Shape.C height, Shape.C width, Class.Floating a) =>
    Either Conjugation Conjugation ->
    Vector height a -> Vector width a -> Matrix height width a
-tensorProduct side (Array height x) (Array width y) =
-   Array.unsafeCreate (height,width) $ \cPtr -> do
-   let m = Shape.size width
-   let n = Shape.size height
+tensorProduct side (Array height_ x) (Array width_ y) =
+   Array.unsafeCreateWithAutoSizes (height_,width_) $
+      \(SubSize.Atom n, SubSize.Atom m) cPtr -> do
    let trans conjugated =
          case conjugated of NonConjugated -> 'T'; Conjugated -> 'C'
    let ((transa,transb),(lda,ldb)) =
@@ -120,26 +271,26 @@
    (Class.Real a) =>
    Matrix height width (Complex a) ->
    Matrix height (width, ComplexShape) a
-decomplex (Array (height,width) a) =
-   Array (height, (width, Shape.static)) (castForeignPtr a)
+decomplex (Array (height_,width_) a) =
+   Array (height_, (width_, Shape.static)) (castForeignPtr a)
 
 recomplex ::
    (Class.Real a) =>
    Matrix height (width, ComplexShape) a ->
    Matrix height width (Complex a)
-recomplex (Array (height, (width, Shape.NestedTuple _)) a) =
-   Array (height,width) (castForeignPtr a)
+recomplex (Array (height_, (width_, Shape.NestedTuple _)) a) =
+   Array (height_,width_) (castForeignPtr a)
 
 
 scaleRows ::
    (Shape.C height, Eq height, Shape.C width, Class.Floating a) =>
    Vector height a -> Matrix height width a -> Matrix height width a
-scaleRows (Array heightX x) (Array shape@(height,width) a) =
-      Array.unsafeCreate shape $ \bPtr -> do
-   Call.assert "scaleRows: sizes mismatch" (heightX == height)
+scaleRows (Array heightX x) (Array shape a) =
+   Array.unsafeCreateWithAutoSizes shape $
+      \(SubSize.Atom m, SubSize.Atom n) bPtr -> do
+
+   Call.assert "scaleRows: sizes mismatch" (heightX == fst shape)
    evalContT $ do
-      let m = Shape.size height
-      let n = Shape.size width
       nPtr <- Call.cint n
       xPtr <- ContT $ withForeignPtr x
       aPtr <- ContT $ withForeignPtr a
@@ -157,12 +308,12 @@
 scaleColumns ::
    (Shape.C height, Shape.C width, Eq width, Class.Floating a) =>
    Vector width a -> Matrix height width a -> Matrix height width a
-scaleColumns (Array widthX x) (Array shape@(height,width) a) =
-      Array.unsafeCreate shape $ \bPtr -> do
-   Call.assert "scaleColumns: sizes mismatch" (widthX == width)
+scaleColumns (Array widthX x) (Array shape a) =
+   Array.unsafeCreateWithAutoSizes shape $
+      \(SubSize.Atom m, SubSize.Atom n) bPtr -> do
+
+   Call.assert "scaleColumns: sizes mismatch" (widthX == snd shape)
    evalContT $ do
-      let m = Shape.size height
-      let n = Shape.size width
       transPtr <- Call.char 'N'
       nPtr <- Call.cint n
       klPtr <- Call.cint 0
@@ -184,47 +335,106 @@
             (pointerSeq n bPtr)
 
 
+{- |
+>>> Matrix.multiplyVectorLeft (Array.vectorFromList [3,1,4]) (Array.fromList (Shape.ZeroBased (3::Int), Shape.Range 'a' 'b') [0,1,0,0,1,0::Real_])
+StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [4.0,3.0]
+
+prop> :{
+   forVector number_ $ \xs ->
+   Matrix.multiplyVectorLeft xs (Matrix.identity (Array.shape xs)) == xs
+:}
+-}
 multiplyVectorLeft ::
    (Eq height, Shape.C height, Shape.C width, Class.Floating a) =>
    Vector height a -> Matrix height width a -> Vector width a
-multiplyVectorLeft = multiplyVector nonTransposed
+multiplyVectorLeft x a = multiplyVector x (NonTransposed a)
 
+{- |
+>>> Matrix.multiplyVectorRight (Array.fromList (Shape.Range 'a' 'b', Shape.ZeroBased (3::Int)) [0,0,1,1,0,0]) (Array.vectorFromList [3,1,4::Real_])
+StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [4.0,3.0]
+>>> Matrix.multiplyVectorRight (Array.fromList (Shape.Range 'a' 'b', Shape.ZeroBased (3::Int)) [2,7,1,8,2,8]) (Array.vectorFromList [3,1,4::Real_])
+StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [17.0,58.0]
+
+prop> :{
+   forVector number_ $ \xs ->
+   Matrix.multiplyVectorRight (Matrix.identity (Array.shape xs)) xs == xs
+:}
+
+prop> :{
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \x ->
+   Matrix.singleColumn (Matrix.multiplyVectorRight a x)
+   ==
+   Matrix.multiply a (Matrix.singleColumn x)
+:}
+
+prop> :{
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (fst $ Array.shape a) number_) $ \x ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \y ->
+   Vector.dot x (Matrix.multiplyVectorRight a y)
+   ==
+   Vector.dot (Matrix.multiplyVectorLeft x a) y
+:}
+
+prop> :{
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \x ->
+   Matrix.multiplyVectorRight a x
+   ==
+   Matrix.multiplyVectorLeft x (transpose a)
+:}
+-}
 multiplyVectorRight ::
    (Shape.C height, Shape.C width, Eq width, Class.Floating a) =>
    Matrix height width a -> Vector width a -> Vector height a
-multiplyVectorRight = flip $ multiplyVector transposed
+multiplyVectorRight a x = multiplyVector x (Transposed a)
 
 
-data Transposition heightA widthA heightB widthB =
-   Transposition
-      Modifier.Transposition Char
-      ((heightA,widthA) -> (heightB,widthB))
+data Transposable height width a =
+     NonTransposed (Matrix height width a)
+   | Transposed (Matrix width height a)
+   deriving (Show)
 
-transposed :: Transposition height width width height
-transposed = Transposition Modifier.Transposed 'T' swap
 
-nonTransposed :: Transposition height width height width
-nonTransposed = Transposition Modifier.NonTransposed 'N' id
+nonTransposed :: Matrix height width a -> Transposable height width a
+nonTransposed = NonTransposed
 
+transposed :: Matrix height width a -> Transposable width height a
+transposed = Transposed
+
+
+transposeTransposable ::
+   Transposable height width a -> Transposable width height a
+transposeTransposable at =
+   case at of
+      NonTransposed a -> Transposed a
+      Transposed a -> NonTransposed a
+
+
+inspectTransposable ::
+   Transposable height width a -> (Char, (height, width), ForeignPtr a)
+inspectTransposable at =
+   case at of
+      NonTransposed (Array shA fptr) -> ('N', shA, fptr)
+      Transposed (Array shA fptr) -> ('T', swap shA, fptr)
+
 multiplyVector ::
-   (Shape.C heightB, Shape.C widthB, Eq heightB, Class.Floating a) =>
-   Transposition heightA widthA heightB widthB ->
-   Vector heightB a -> Matrix heightA widthA a -> Vector widthB a
-multiplyVector
-      (Transposition trans transChar assignDims)
-      (Array sh x) (Array shA a) =
-   let (height,width) = assignDims shA in
-   Array.unsafeCreateWithSize width $ \m0 yPtr -> do
+   (Shape.C height, Shape.C width, Eq height, Class.Floating a) =>
+   Vector height a -> Transposable height width a -> Vector width a
+multiplyVector (Array sh x) at =
+   let (transChar, (height_,width_), a) = inspectTransposable at in
+   Array.unsafeCreateWithSize width_ $ \m0 yPtr -> do
    Call.assert
       "Matrix.RowMajor.multiplyVector: shapes mismatch"
-      (height == sh)
-   let n0 = Shape.size height
+      (height_ == sh)
+   let n0 = Shape.size height_
    let (m,n) =
-         case trans of
-            Modifier.NonTransposed -> (m0,n0)
-            Modifier.Transposed -> (n0,m0)
-   if n==0
-      then fill zero m yPtr
+         case at of
+            NonTransposed _ -> (m0,n0)
+            Transposed _ -> (n0,m0)
+   if n0==0
+      then fill zero m0 yPtr
       else evalContT $ do
 
       let lda = m
@@ -242,3 +452,193 @@
          Blas.gemv
             transPtr mPtr nPtr alphaPtr aPtr ldaPtr
             xPtr incxPtr betaPtr yPtr incyPtr
+
+
+{- |
+>>> :{
+   Matrix.multiply
+      (Array.fromList (shapeInt 2, shapeInt 2) [1000,100,10,1])
+      (Array.fromList (shapeInt 2, shapeInt 3) [0..5::Real_])
+:}
+... [300.0,1400.0,2500.0,3.0,14.0,25.0]
+
+prop> :{
+   forMatrix number_ $ \a ->
+      Matrix.multiply (Matrix.identity (Matrix.height a)) a == a
+:}
+prop> :{
+   forMatrix number_ $ \a ->
+      Matrix.multiply a (Matrix.identity (Matrix.width a)) == a
+:}
+prop> :{
+   forMatrix number_ $ \a ->
+   forMatrix number_ $ \c ->
+   QC.forAll (genVector (Matrix.width a, Matrix.height c) number_) $ \b ->
+      Matrix.multiply a (Matrix.multiply b c)
+      ==
+      Matrix.multiply (Matrix.multiply a b) c
+:}
+-}
+multiply ::
+   (Shape.C height, Shape.C width, Shape.C fuse, Eq fuse, Class.Floating a) =>
+   Matrix height fuse a -> Matrix fuse width a -> Matrix height width a
+multiply a b = multiplyTransposable (NonTransposed a) (NonTransposed b)
+
+{- |
+prop> :{
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.height a)) $ \eye ->
+      a == Matrix.multiplyTransposable eye (Matrix.nonTransposed a)
+:}
+prop> :{
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.width a)) $ \eye ->
+      a == Matrix.multiplyTransposable (Matrix.nonTransposed a) eye
+:}
+prop> :{
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.width a)) $ \leftEye ->
+   QC.forAll (genIdentityTrans (Matrix.height a)) $ \rightEye ->
+      Matrix.multiplyTransposable leftEye (Matrix.transposed a)
+      ==
+      Matrix.multiplyTransposable (Matrix.transposed a) rightEye
+:}
+prop> :{
+   forMatrix number_ $ \a ->
+   QC.forAll (QC.choose (0,maxDim)) $ \n ->
+   QC.forAll (genVector (Matrix.width a, shapeInt n) number_) $ \b ->
+      transpose (Matrix.multiply a b)
+      ==
+      Matrix.multiplyTransposable (Matrix.transposed b) (Matrix.transposed a)
+:}
+-}
+multiplyTransposable ::
+   (Shape.C height, Shape.C width, Shape.C fuse, Eq fuse, Class.Floating a) =>
+   Transposable height fuse a ->
+   Transposable fuse width a ->
+   Matrix height width a
+multiplyTransposable a b = multiplyColumnMajor b a
+
+multiplyColumnMajor ::
+   (Shape.C height, Shape.C width, Shape.C fuse, Eq fuse, Class.Floating a) =>
+   Transposable fuse height a ->
+   Transposable width fuse a ->
+   Matrix width height a
+multiplyColumnMajor at bt =
+   let (transa, (widthA,heightA), a) = inspectTransposable at in
+   let (transb, (widthB,heightB), b) = inspectTransposable bt in
+   Array.unsafeCreate (widthB,heightA) $ \cPtr -> do
+   Call.assert
+      "Matrix.RowMajor.multiply: shapes mismatch"
+      (widthA == heightB)
+
+   evalContT $ do
+   let m = Shape.size heightA
+   let k = Shape.size widthA
+   let n = Shape.size widthB
+   let lda = case at of NonTransposed _ -> m; Transposed _ -> k
+   let ldb = case bt of NonTransposed _ -> k; Transposed _ -> n
+   let ldc = m
+   if k==0
+      then liftIO $ fill zero (m*n) cPtr
+      else do
+      transaPtr <- Call.char transa
+      transbPtr <- Call.char transb
+      mPtr <- Call.cint m
+      nPtr <- Call.cint n
+      kPtr <- Call.cint k
+      alphaPtr <- Call.number one
+      aPtr <- ContT $ withForeignPtr a
+      ldaPtr <- Call.leadingDim lda
+      bPtr <- ContT $ withForeignPtr b
+      ldbPtr <- Call.leadingDim ldb
+      betaPtr <- Call.number zero
+      ldcPtr <- Call.leadingDim ldc
+      liftIO $
+         Blas.gemm
+            transaPtr transbPtr mPtr nPtr kPtr alphaPtr aPtr ldaPtr
+            bPtr ldbPtr betaPtr cPtr ldcPtr
+
+
+{- |
+>>> :{
+   Matrix.kronecker
+      (Array.fromList (shapeInt 2, shapeInt 2) [0,1,-1,0::Real_])
+      (Array.fromList (shapeInt 2, shapeInt 3) [1..6])
+:}
+... [0.0,0.0,0.0,1.0,2.0,3.0,0.0,0.0,0.0,4.0,5.0,6.0,-1.0,-2.0,-3.0,0.0,0.0,0.0,-4.0,-5.0,-6.0,0.0,0.0,0.0]
+
+>>> :{
+   Matrix.kronecker
+      (Array.fromList (shapeInt 2, shapeInt 2) [1,2,3,4::Real_])
+      (Array.fromList (shapeInt 2, shapeInt 3) [1,2,4,8,16,32])
+:}
+... [1.0,2.0,4.0,2.0,4.0,8.0,8.0,16.0,32.0,16.0,32.0,64.0,3.0,6.0,12.0,4.0,8.0,16.0,24.0,48.0,96.0,32.0,64.0,128.0]
+
+prop> :{
+   QC.forAll (QC.choose (0,5)) $ \m ->
+   QC.forAll (QC.choose (0,5)) $ \n ->
+      Matrix.kronecker
+         (Matrix.identity (shapeInt m))
+         (Matrix.identity (shapeInt n))
+      ==
+      (Matrix.identity (shapeInt m, shapeInt n)
+         :: Matrix.Square (ShapeInt, ShapeInt) Number_)
+:}
+-}
+kronecker ::
+   (Shape.C heightA, Shape.C widthA, Shape.C heightB, Shape.C widthB,
+    Class.Floating a) =>
+   Matrix heightA widthA a ->
+   Matrix heightB widthB a ->
+   Matrix (heightA,heightB) (widthA,widthB) a
+kronecker a b = kroneckerLeftTransposable (NonTransposed a) b
+
+kroneckerTransposable ::
+   (Shape.C heightA, Shape.C widthA, Shape.C heightB, Shape.C widthB,
+    Class.Floating a) =>
+   Transposable heightA widthA a ->
+   Transposable heightB widthB a ->
+   Transposable (heightA,heightB) (widthA,widthB) a
+kroneckerTransposable at bt =
+   case bt of
+      NonTransposed b -> NonTransposed $ kroneckerLeftTransposable at b
+      Transposed b ->
+         Transposed $ kroneckerLeftTransposable (transposeTransposable at) b
+
+kroneckerLeftTransposable ::
+   (Shape.C heightA, Shape.C widthA, Shape.C heightB, Shape.C widthB,
+    Class.Floating a) =>
+   Transposable heightA widthA a ->
+   Matrix heightB widthB a ->
+   Matrix (heightA,heightB) (widthA,widthB) a
+kroneckerLeftTransposable at (Array (heightB,widthB) b) =
+   let (_trans, (heightA,widthA), a) = inspectTransposable at
+   in Array.unsafeCreate ((heightA,heightB), (widthA,widthB)) $ \cPtr ->
+      evalContT $ do
+   let (ma,na) = (Shape.size heightA, Shape.size widthA)
+   let (mb,nb) = (Shape.size heightB, Shape.size widthB)
+   let (lda,istep) =
+         case at of
+            NonTransposed _ -> (1,na)
+            Transposed _ -> (ma,1)
+   transaPtr <- Call.char 'N'
+   transbPtr <- Call.char 'T'
+   mPtr <- Call.cint na
+   nPtr <- Call.cint nb
+   kPtr <- Call.cint 1
+   alphaPtr <- Call.number one
+   aPtr <- ContT $ withForeignPtr a
+   ldaPtr <- Call.leadingDim lda
+   bPtr <- ContT $ withForeignPtr b
+   ldbPtr <- Call.leadingDim 1
+   betaPtr <- Call.number zero
+   ldcPtr <- Call.leadingDim nb
+   liftIO $
+      forM_ (liftA2 (,) (take ma [0..]) (take mb [0..])) $ \(i,j) -> do
+         let aiPtr = advancePtr aPtr (istep*i)
+         let bjPtr = advancePtr bPtr (nb*j)
+         let cijPtr = advancePtr cPtr (na*nb*(j+mb*i))
+         Blas.gemm
+            transbPtr transaPtr nPtr mPtr kPtr alphaPtr
+            bjPtr ldbPtr aiPtr ldaPtr betaPtr cijPtr ldcPtr
diff --git a/src/Numeric/BLAS/Vector.hs b/src/Numeric/BLAS/Vector.hs
--- a/src/Numeric/BLAS/Vector.hs
+++ b/src/Numeric/BLAS/Vector.hs
@@ -102,6 +102,7 @@
 >>> import Test.Generator (genNumber)
 >>> import Test.Slice (shapeInt)
 >>> import Test.Utility (approx)
+>>> import qualified Numeric.BLAS.Matrix.RowMajor as Matrix
 >>> import qualified Numeric.BLAS.Vector as Vector
 >>> import qualified Numeric.Netlib.Class as Class
 >>> import qualified Data.Array.Comfort.Shape as Shape
@@ -207,19 +208,44 @@
 
 
 {- |
-> constant () = singleton
+prop> QC.forAll number_ $ \x -> Vector.constant () x == Vector.singleton x
 
+prop> :{
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   QC.forAll number_ $ \x ->
+      Vector.sum (Vector.constant (shapeInt n) x) == fromIntegral n * x
+:}
+
 However, singleton does not need 'Class.Floating' constraint.
 -}
 constant :: (Shape.C sh, Class.Floating a) => sh -> a -> Vector sh a
 constant sh a = Array.unsafeCreateWithSize sh $ fill a
 
+{- |
+prop> :{
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   Vector.sum (Vector.zero (shapeInt n)) == (0 :: Number_)
+:}
+-}
 zero :: (Shape.C sh, Class.Floating a) => sh -> Vector sh a
 zero = flip constant Scalar.zero
 
+{- |
+prop> :{
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   Vector.sum (Vector.one (shapeInt n)) == (fromIntegral n :: Number_)
+:}
+-}
 one :: (Shape.C sh, Class.Floating a) => sh -> Vector sh a
 one = flip constant Scalar.one
 
+{- |
+prop> :{
+   QC.forAll (fmap shapeInt $ QC.choose (1,1000)) $ \sh ->
+   QC.forAll (QC.elements $ Shape.indices sh) $ \k ->
+   Vector.sum (Vector.unit sh k) == (1 :: Number_)
+:}
+-}
 unit ::
    (Shape.Indexed sh, Class.Floating a) =>
    sh -> Shape.Index sh -> Vector sh a
@@ -288,7 +314,14 @@
 
 
 {- |
-prop> QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
+prop> :{
+   QC.forAll (QC.choose (1,100)) $ \dim ->
+   QC.forAll (QC.choose (0, dim-1)) $ \i ->
+   QC.forAll (QC.choose (0, dim-1)) $ \j ->
+      Vector.unit (Shape.ZeroBased dim) i
+      ==
+      (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
+:}
 -}
 swap ::
    (Shape.Indexed sh, Storable a) =>
@@ -308,7 +341,23 @@
 newtype Dot f a = Dot {runDot :: f a -> f a -> a}
 
 {- |
-> dot x y = Matrix.toScalar (singleRow x -*| singleColumn y)
+prop> :{
+   forVector2 number_ $ \xs ys ->
+      Vector.dot xs ys
+      ==
+      Matrix.multiply (Matrix.singleRow xs) (Matrix.singleColumn ys) ! ((),())
+:}
+
+prop> :{
+   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_)
+:}
 -}
 dot, (-*|) ::
    (Shape.C sh, Eq sh, Class.Floating a) =>
@@ -323,6 +372,8 @@
       (Dot $ dotComplex 'T')
 
 {- |
+Scalar product
+
 prop> forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys
 -}
 inner ::
@@ -575,7 +626,7 @@
 {- |
 prop> forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs
 
-In contrast to 'Array.limits'
+In contrast to 'CheckedArray.limits'
 this implementation is based on fast BLAS functions.
 It should be faster than @Array.minimum@ and @Array.maximum@
 although it is certainly not as fast as possible.
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,15 +2,10 @@
 
 import qualified Test.Numeric.BLAS.Slice as Slice
 
-import qualified Test.Float.Numeric.BLAS.Vector as VectorFloat
-import qualified Test.Double.Numeric.BLAS.Vector as VectorDouble
-import qualified Test.ComplexFloat.Numeric.BLAS.Vector as VectorComplexFloat
-import qualified Test.ComplexDouble.Numeric.BLAS.Vector as VectorComplexDouble
-
-import qualified Test.Float.Numeric.BLAS.Vector.Slice as SliceFloat
-import qualified Test.Double.Numeric.BLAS.Vector.Slice as SliceDouble
-import qualified Test.ComplexFloat.Numeric.BLAS.Vector.Slice as SliceComplexFloat
-import qualified Test.ComplexDouble.Numeric.BLAS.Vector.Slice as SliceComplexDouble
+import qualified Test.Float.Main as TestFloat
+import qualified Test.Double.Main as TestDouble
+import qualified Test.ComplexFloat.Main as TestComplexFloat
+import qualified Test.ComplexDouble.Main as TestComplexDouble
 
 import qualified Test.DocTest.Driver as DocTest
 
@@ -19,14 +14,10 @@
    DocTest.printLine "\nSlice"
    Slice.test
    DocTest.printLine "\nFloat"
-   VectorFloat.test
-   SliceFloat.test
+   TestFloat.main
    DocTest.printLine "\nDouble"
-   VectorDouble.test
-   SliceDouble.test
+   TestDouble.main
    DocTest.printLine "\nComplex Float"
-   VectorComplexFloat.test
-   SliceComplexFloat.test
+   TestComplexFloat.main
    DocTest.printLine "\nComplex Double"
-   VectorComplexDouble.test
-   SliceComplexDouble.test
+   TestComplexDouble.main
diff --git a/test/Test/ComplexDouble/Main.hs b/test/Test/ComplexDouble/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/ComplexDouble/Main.hs
@@ -0,0 +1,14 @@
+-- Do not edit! Automatically created with doctest-extract.
+module Test.ComplexDouble.Main where
+
+import qualified Test.ComplexDouble.Numeric.BLAS.Matrix.RowMajor
+import qualified Test.ComplexDouble.Numeric.BLAS.Vector.Slice
+import qualified Test.ComplexDouble.Numeric.BLAS.Vector
+
+import qualified Test.DocTest.Driver as DocTest
+
+main :: DocTest.T ()
+main = do
+    Test.ComplexDouble.Numeric.BLAS.Matrix.RowMajor.test
+    Test.ComplexDouble.Numeric.BLAS.Vector.Slice.test
+    Test.ComplexDouble.Numeric.BLAS.Vector.test
diff --git a/test/Test/ComplexDouble/Numeric/BLAS/Matrix/RowMajor.hs b/test/Test/ComplexDouble/Numeric/BLAS/Matrix/RowMajor.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/ComplexDouble/Numeric/BLAS/Matrix/RowMajor.hs
@@ -0,0 +1,254 @@
+-- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Matrix/RowMajor.hs
+{-# LINE 63 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+
+module Test.ComplexDouble.Numeric.BLAS.Matrix.RowMajor where
+
+import Test.DocTest.Base
+import qualified Test.DocTest.Driver as DocTest
+
+{-# LINE 64 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+import     Test.ComplexDouble.Type (Number_)
+import     Test.ComplexDouble.Numeric.BLAS.Vector (forVector, genVector, number_)
+import     Test.Slice (ShapeInt, shapeInt)
+import     qualified Numeric.BLAS.Matrix.RowMajor as Matrix
+import     qualified Numeric.BLAS.Vector as Vector
+import     qualified Numeric.Netlib.Class as Class
+import     Numeric.BLAS.Scalar (RealOf)
+import     qualified Data.Array.Comfort.Storable as Array
+import     qualified Data.Array.Comfort.Shape as Shape
+import     qualified Test.QuickCheck as QC
+
+type     Matrix = Matrix.Matrix (Shape.ZeroBased Int) (Shape.ZeroBased Int)
+type     Real_ = RealOf Number_
+
+maxDim     :: Int
+maxDim     = 10
+
+forMatrix     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Matrix a -> prop) -> QC.Property
+forMatrix     genElem =
+       QC.forAll
+          (do height <- fmap shapeInt $ QC.choose (0,maxDim)
+              width <- fmap shapeInt $ QC.choose (0,maxDim)
+              genVector (height, width) genElem)
+
+genIdentityTrans     ::
+       (Shape.C sh, Class.Floating a) =>
+       sh -> QC.Gen (Matrix.Transposable sh sh a)
+genIdentityTrans     sh = do
+       trans <- QC.arbitrary
+       return $
+          if trans
+             then Matrix.transposed (Matrix.identity sh)
+             else Matrix.nonTransposed (Matrix.identity sh)
+
+transpose     ::
+       (Shape.C height, Eq height, Shape.C width, Class.Floating a) =>
+       Matrix.Matrix height width a -> Matrix.Matrix width height a
+transpose     a =
+       Matrix.multiplyTransposable
+          (Matrix.transposed a)
+          (Matrix.nonTransposed (Matrix.identity (Matrix.height a)))
+
+test :: DocTest.T ()
+test = do
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:129: "
+{-# LINE 129 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 129 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.identity (Shape.ZeroBased 0) :: Matrix.Square (Shape.ZeroBased Int) Real_
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (ZeroBased {",WildCardChunk,LineChunk " 0},ZeroBased {",WildCardChunk,LineChunk " 0}) []"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:131: "
+{-# LINE 131 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 131 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.identity (Shape.ZeroBased 3) :: Matrix.Square (Shape.ZeroBased Int) Real_
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (ZeroBased {",WildCardChunk,LineChunk " 3},ZeroBased {",WildCardChunk,LineChunk " 3}) [1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:339: "
+{-# LINE 339 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 339 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorLeft (Array.vectorFromList [3,1,4]) (Array.fromList (Shape.ZeroBased (3::Int), Shape.Range 'a' 'b') [0,1,0,0,1,0::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [4.0,3.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:342: "
+{-# LINE 342 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 342 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forVector number_ $ \xs ->
+   Matrix.multiplyVectorLeft xs (Matrix.identity (Array.shape xs)) == xs
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:353: "
+{-# LINE 353 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 353 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorRight (Array.fromList (Shape.Range 'a' 'b', Shape.ZeroBased (3::Int)) [0,0,1,1,0,0]) (Array.vectorFromList [3,1,4::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [4.0,3.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:355: "
+{-# LINE 355 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 355 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorRight (Array.fromList (Shape.Range 'a' 'b', Shape.ZeroBased (3::Int)) [2,7,1,8,2,8]) (Array.vectorFromList [3,1,4::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [17.0,58.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:358: "
+{-# LINE 358 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 358 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forVector number_ $ \xs ->
+   Matrix.multiplyVectorRight (Matrix.identity (Array.shape xs)) xs == xs
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:363: "
+{-# LINE 363 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 363 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \x ->
+   Matrix.singleColumn (Matrix.multiplyVectorRight a x)
+   ==
+   Matrix.multiply a (Matrix.singleColumn x)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:371: "
+{-# LINE 371 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 371 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (fst $ Array.shape a) number_) $ \x ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \y ->
+   Vector.dot x (Matrix.multiplyVectorRight a y)
+   ==
+   Vector.dot (Matrix.multiplyVectorLeft x a) y
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:380: "
+{-# LINE 380 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 380 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \x ->
+   Matrix.multiplyVectorRight a x
+   ==
+   Matrix.multiplyVectorLeft x (transpose a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:458: "
+{-# LINE 458 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 458 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.multiply
+      (Array.fromList (shapeInt 2, shapeInt 2) [1000,100,10,1])
+      (Array.fromList (shapeInt 2, shapeInt 3) [0..5::Real_])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [300.0,1400.0,2500.0,3.0,14.0,25.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:465: "
+{-# LINE 465 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 465 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+      Matrix.multiply (Matrix.identity (Matrix.height a)) a == a
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:469: "
+{-# LINE 469 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 469 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+      Matrix.multiply a (Matrix.identity (Matrix.width a)) == a
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:473: "
+{-# LINE 473 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 473 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   forMatrix number_ $ \c ->
+   QC.forAll (genVector (Matrix.width a, Matrix.height c) number_) $ \b ->
+      Matrix.multiply a (Matrix.multiply b c)
+      ==
+      Matrix.multiply (Matrix.multiply a b) c
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:488: "
+{-# LINE 488 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 488 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.height a)) $ \eye ->
+      a == Matrix.multiplyTransposable eye (Matrix.nonTransposed a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:493: "
+{-# LINE 493 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 493 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.width a)) $ \eye ->
+      a == Matrix.multiplyTransposable (Matrix.nonTransposed a) eye
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:498: "
+{-# LINE 498 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 498 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.width a)) $ \leftEye ->
+   QC.forAll (genIdentityTrans (Matrix.height a)) $ \rightEye ->
+      Matrix.multiplyTransposable leftEye (Matrix.transposed a)
+      ==
+      Matrix.multiplyTransposable (Matrix.transposed a) rightEye
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:506: "
+{-# LINE 506 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 506 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (QC.choose (0,maxDim)) $ \n ->
+   QC.forAll (genVector (Matrix.width a, shapeInt n) number_) $ \b ->
+      transpose (Matrix.multiply a b)
+      ==
+      Matrix.multiplyTransposable (Matrix.transposed b) (Matrix.transposed a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:564: "
+{-# LINE 564 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 564 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.kronecker
+      (Array.fromList (shapeInt 2, shapeInt 2) [0,1,-1,0::Real_])
+      (Array.fromList (shapeInt 2, shapeInt 3) [1..6])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [0.0,0.0,0.0,1.0,2.0,3.0,0.0,0.0,0.0,4.0,5.0,6.0,-1.0,-2.0,-3.0,0.0,0.0,0.0,-4.0,-5.0,-6.0,0.0,0.0,0.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:571: "
+{-# LINE 571 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 571 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.kronecker
+      (Array.fromList (shapeInt 2, shapeInt 2) [1,2,3,4::Real_])
+      (Array.fromList (shapeInt 2, shapeInt 3) [1,2,4,8,16,32])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [1.0,2.0,4.0,2.0,4.0,8.0,8.0,16.0,32.0,16.0,32.0,64.0,3.0,6.0,12.0,4.0,8.0,16.0,24.0,48.0,96.0,32.0,64.0,128.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:578: "
+{-# LINE 578 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 578 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   QC.forAll (QC.choose (0,5)) $ \m ->
+   QC.forAll (QC.choose (0,5)) $ \n ->
+      Matrix.kronecker
+         (Matrix.identity (shapeInt m))
+         (Matrix.identity (shapeInt n))
+      ==
+      (Matrix.identity (shapeInt m, shapeInt n)
+         :: Matrix.Square (ShapeInt, ShapeInt) Number_)
+  )
diff --git a/test/Test/ComplexDouble/Numeric/BLAS/Vector.hs b/test/Test/ComplexDouble/Numeric/BLAS/Vector.hs
--- a/test/Test/ComplexDouble/Numeric/BLAS/Vector.hs
+++ b/test/Test/ComplexDouble/Numeric/BLAS/Vector.hs
@@ -11,6 +11,7 @@
 import     Test.Generator (genNumber)
 import     Test.Slice (shapeInt)
 import     Test.Utility (approx)
+import     qualified Numeric.BLAS.Matrix.RowMajor as Matrix
 import     qualified Numeric.BLAS.Vector as Vector
 import     qualified Numeric.Netlib.Class as Class
 import     qualified Data.Array.Comfort.Shape as Shape
@@ -102,215 +103,285 @@
 
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector:239: "
-{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:211: "
+{-# LINE 211 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 211 "src/Numeric/BLAS/Vector.hs" #-}
+      QC.forAll number_ $ \x -> Vector.constant () x == Vector.singleton x
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:213: "
+{-# LINE 213 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 213 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   QC.forAll number_ $ \x ->
+      Vector.sum (Vector.constant (shapeInt n) x) == fromIntegral n * x
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:225: "
+{-# LINE 225 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 225 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   Vector.sum (Vector.zero (shapeInt n)) == (0 :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:234: "
+{-# LINE 234 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 234 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   Vector.sum (Vector.one (shapeInt n)) == (fromIntegral n :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:243: "
+{-# LINE 243 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 243 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (fmap shapeInt $ QC.choose (1,1000)) $ \sh ->
+   QC.forAll (QC.elements $ Shape.indices sh) $ \k ->
+   Vector.sum (Vector.unit sh k) == (1 :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:265: "
+{-# LINE 265 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 265 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> forVector number_ $ \zs -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:248: "
-{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:274: "
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:249: "
-{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:275: "
+{-# LINE 275 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 275 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:250: "
-{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:276: "
+{-# LINE 276 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 276 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:252: "
-{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:278: "
+{-# LINE 278 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 278 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:253: "
-{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:279: "
+{-# LINE 279 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 279 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:254: "
-{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:280: "
+{-# LINE 280 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 280 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> Vector.reverse (xs <> ys) == Vector.reverse ys <> Vector.reverse xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:269: "
-{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:295: "
+{-# LINE 295 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 295 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList [])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:270: "
-{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:296: "
+{-# LINE 296 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 296 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:271: "
-{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:297: "
+{-# LINE 297 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 297 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:272: "
-{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:298: "
+{-# LINE 298 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 298 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1,6,5,4,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3,4,5,6])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:274: "
-{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:300: "
+{-# LINE 300 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 300 "src/Numeric/BLAS/Vector.hs" #-}
       forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:291: "
-{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:317: "
+{-# LINE 317 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
-      QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
+{-# LINE 317 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (1,100)) $ \dim ->
+   QC.forAll (QC.choose (0, dim-1)) $ \i ->
+   QC.forAll (QC.choose (0, dim-1)) $ \j ->
+      Vector.unit (Shape.ZeroBased dim) i
+      ==
+      (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:326: "
-{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:344: "
+{-# LINE 344 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 344 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   forVector2 number_ $ \xs ys ->
+      Vector.dot xs ys
+      ==
+      Matrix.multiply (Matrix.singleRow xs) (Matrix.singleColumn ys) ! ((),())
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:351: "
+{-# LINE 351 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 351 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   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_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:377: "
+{-# LINE 377 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 377 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:379: "
-{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:430: "
+{-# LINE 430 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 430 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:439: "
-{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:490: "
+{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:463: "
-{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:514: "
+{-# LINE 514 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example(
-{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 514 "src/Numeric/BLAS/Vector.hs" #-}
     Vector.argAbsMaximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
   )
   [ExpectedLine [LineChunk "(3,6.0 :+ 0.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:466: "
-{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:517: "
+{-# LINE 517 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 517 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:467: "
-{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:518: "
+{-# LINE 518 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 518 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:468: "
-{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:519: "
+{-# LINE 519 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 519 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:512: "
-{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:563: "
+{-# LINE 563 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example(
-{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 563 "src/Numeric/BLAS/Vector.hs" #-}
     Vector.argAbs1Maximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
   )
   [ExpectedLine [LineChunk "(1,3.0 :+ 4.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:515: "
-{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:566: "
+{-# LINE 566 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 566 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:548: "
-{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:599: "
+{-# LINE 599 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 599 "src/Numeric/BLAS/Vector.hs" #-}
       QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector (shapeInt dim) (genNumber 3)) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_)))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:558: "
-{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:609: "
+{-# LINE 609 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 609 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:559: "
-{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:610: "
+{-# LINE 610 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 610 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:560: "
-{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:611: "
+{-# LINE 611 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 611 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:576: "
-{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:627: "
+{-# LINE 627 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 627 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:606: "
-{-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:657: "
+{-# LINE 657 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 657 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:607: "
-{-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:658: "
+{-# LINE 658 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 658 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:676: "
-{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:727: "
+{-# LINE 727 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 727 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:677: "
-{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:728: "
+{-# LINE 728 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 728 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:707: "
-{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:758: "
+{-# LINE 758 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 758 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:720: "
-{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:771: "
+{-# LINE 771 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 771 "src/Numeric/BLAS/Vector.hs" #-}
       QC.forAll (genNumber maxElem) $ \d -> forVector number_ $ \xs -> xs == Vector.raise (-d) (Vector.raise d xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:737: "
-{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:788: "
+{-# LINE 788 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 788 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:745: "
-{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:796: "
+{-# LINE 796 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 796 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys
   )
diff --git a/test/Test/ComplexFloat/Main.hs b/test/Test/ComplexFloat/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/ComplexFloat/Main.hs
@@ -0,0 +1,14 @@
+-- Do not edit! Automatically created with doctest-extract.
+module Test.ComplexFloat.Main where
+
+import qualified Test.ComplexFloat.Numeric.BLAS.Matrix.RowMajor
+import qualified Test.ComplexFloat.Numeric.BLAS.Vector.Slice
+import qualified Test.ComplexFloat.Numeric.BLAS.Vector
+
+import qualified Test.DocTest.Driver as DocTest
+
+main :: DocTest.T ()
+main = do
+    Test.ComplexFloat.Numeric.BLAS.Matrix.RowMajor.test
+    Test.ComplexFloat.Numeric.BLAS.Vector.Slice.test
+    Test.ComplexFloat.Numeric.BLAS.Vector.test
diff --git a/test/Test/ComplexFloat/Numeric/BLAS/Matrix/RowMajor.hs b/test/Test/ComplexFloat/Numeric/BLAS/Matrix/RowMajor.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/ComplexFloat/Numeric/BLAS/Matrix/RowMajor.hs
@@ -0,0 +1,254 @@
+-- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Matrix/RowMajor.hs
+{-# LINE 63 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+
+module Test.ComplexFloat.Numeric.BLAS.Matrix.RowMajor where
+
+import Test.DocTest.Base
+import qualified Test.DocTest.Driver as DocTest
+
+{-# LINE 64 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+import     Test.ComplexFloat.Type (Number_)
+import     Test.ComplexFloat.Numeric.BLAS.Vector (forVector, genVector, number_)
+import     Test.Slice (ShapeInt, shapeInt)
+import     qualified Numeric.BLAS.Matrix.RowMajor as Matrix
+import     qualified Numeric.BLAS.Vector as Vector
+import     qualified Numeric.Netlib.Class as Class
+import     Numeric.BLAS.Scalar (RealOf)
+import     qualified Data.Array.Comfort.Storable as Array
+import     qualified Data.Array.Comfort.Shape as Shape
+import     qualified Test.QuickCheck as QC
+
+type     Matrix = Matrix.Matrix (Shape.ZeroBased Int) (Shape.ZeroBased Int)
+type     Real_ = RealOf Number_
+
+maxDim     :: Int
+maxDim     = 10
+
+forMatrix     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Matrix a -> prop) -> QC.Property
+forMatrix     genElem =
+       QC.forAll
+          (do height <- fmap shapeInt $ QC.choose (0,maxDim)
+              width <- fmap shapeInt $ QC.choose (0,maxDim)
+              genVector (height, width) genElem)
+
+genIdentityTrans     ::
+       (Shape.C sh, Class.Floating a) =>
+       sh -> QC.Gen (Matrix.Transposable sh sh a)
+genIdentityTrans     sh = do
+       trans <- QC.arbitrary
+       return $
+          if trans
+             then Matrix.transposed (Matrix.identity sh)
+             else Matrix.nonTransposed (Matrix.identity sh)
+
+transpose     ::
+       (Shape.C height, Eq height, Shape.C width, Class.Floating a) =>
+       Matrix.Matrix height width a -> Matrix.Matrix width height a
+transpose     a =
+       Matrix.multiplyTransposable
+          (Matrix.transposed a)
+          (Matrix.nonTransposed (Matrix.identity (Matrix.height a)))
+
+test :: DocTest.T ()
+test = do
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:129: "
+{-# LINE 129 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 129 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.identity (Shape.ZeroBased 0) :: Matrix.Square (Shape.ZeroBased Int) Real_
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (ZeroBased {",WildCardChunk,LineChunk " 0},ZeroBased {",WildCardChunk,LineChunk " 0}) []"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:131: "
+{-# LINE 131 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 131 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.identity (Shape.ZeroBased 3) :: Matrix.Square (Shape.ZeroBased Int) Real_
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (ZeroBased {",WildCardChunk,LineChunk " 3},ZeroBased {",WildCardChunk,LineChunk " 3}) [1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:339: "
+{-# LINE 339 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 339 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorLeft (Array.vectorFromList [3,1,4]) (Array.fromList (Shape.ZeroBased (3::Int), Shape.Range 'a' 'b') [0,1,0,0,1,0::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [4.0,3.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:342: "
+{-# LINE 342 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 342 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forVector number_ $ \xs ->
+   Matrix.multiplyVectorLeft xs (Matrix.identity (Array.shape xs)) == xs
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:353: "
+{-# LINE 353 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 353 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorRight (Array.fromList (Shape.Range 'a' 'b', Shape.ZeroBased (3::Int)) [0,0,1,1,0,0]) (Array.vectorFromList [3,1,4::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [4.0,3.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:355: "
+{-# LINE 355 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 355 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorRight (Array.fromList (Shape.Range 'a' 'b', Shape.ZeroBased (3::Int)) [2,7,1,8,2,8]) (Array.vectorFromList [3,1,4::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [17.0,58.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:358: "
+{-# LINE 358 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 358 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forVector number_ $ \xs ->
+   Matrix.multiplyVectorRight (Matrix.identity (Array.shape xs)) xs == xs
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:363: "
+{-# LINE 363 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 363 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \x ->
+   Matrix.singleColumn (Matrix.multiplyVectorRight a x)
+   ==
+   Matrix.multiply a (Matrix.singleColumn x)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:371: "
+{-# LINE 371 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 371 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (fst $ Array.shape a) number_) $ \x ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \y ->
+   Vector.dot x (Matrix.multiplyVectorRight a y)
+   ==
+   Vector.dot (Matrix.multiplyVectorLeft x a) y
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:380: "
+{-# LINE 380 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 380 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \x ->
+   Matrix.multiplyVectorRight a x
+   ==
+   Matrix.multiplyVectorLeft x (transpose a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:458: "
+{-# LINE 458 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 458 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.multiply
+      (Array.fromList (shapeInt 2, shapeInt 2) [1000,100,10,1])
+      (Array.fromList (shapeInt 2, shapeInt 3) [0..5::Real_])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [300.0,1400.0,2500.0,3.0,14.0,25.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:465: "
+{-# LINE 465 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 465 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+      Matrix.multiply (Matrix.identity (Matrix.height a)) a == a
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:469: "
+{-# LINE 469 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 469 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+      Matrix.multiply a (Matrix.identity (Matrix.width a)) == a
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:473: "
+{-# LINE 473 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 473 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   forMatrix number_ $ \c ->
+   QC.forAll (genVector (Matrix.width a, Matrix.height c) number_) $ \b ->
+      Matrix.multiply a (Matrix.multiply b c)
+      ==
+      Matrix.multiply (Matrix.multiply a b) c
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:488: "
+{-# LINE 488 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 488 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.height a)) $ \eye ->
+      a == Matrix.multiplyTransposable eye (Matrix.nonTransposed a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:493: "
+{-# LINE 493 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 493 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.width a)) $ \eye ->
+      a == Matrix.multiplyTransposable (Matrix.nonTransposed a) eye
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:498: "
+{-# LINE 498 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 498 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.width a)) $ \leftEye ->
+   QC.forAll (genIdentityTrans (Matrix.height a)) $ \rightEye ->
+      Matrix.multiplyTransposable leftEye (Matrix.transposed a)
+      ==
+      Matrix.multiplyTransposable (Matrix.transposed a) rightEye
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:506: "
+{-# LINE 506 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 506 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (QC.choose (0,maxDim)) $ \n ->
+   QC.forAll (genVector (Matrix.width a, shapeInt n) number_) $ \b ->
+      transpose (Matrix.multiply a b)
+      ==
+      Matrix.multiplyTransposable (Matrix.transposed b) (Matrix.transposed a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:564: "
+{-# LINE 564 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 564 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.kronecker
+      (Array.fromList (shapeInt 2, shapeInt 2) [0,1,-1,0::Real_])
+      (Array.fromList (shapeInt 2, shapeInt 3) [1..6])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [0.0,0.0,0.0,1.0,2.0,3.0,0.0,0.0,0.0,4.0,5.0,6.0,-1.0,-2.0,-3.0,0.0,0.0,0.0,-4.0,-5.0,-6.0,0.0,0.0,0.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:571: "
+{-# LINE 571 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 571 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.kronecker
+      (Array.fromList (shapeInt 2, shapeInt 2) [1,2,3,4::Real_])
+      (Array.fromList (shapeInt 2, shapeInt 3) [1,2,4,8,16,32])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [1.0,2.0,4.0,2.0,4.0,8.0,8.0,16.0,32.0,16.0,32.0,64.0,3.0,6.0,12.0,4.0,8.0,16.0,24.0,48.0,96.0,32.0,64.0,128.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:578: "
+{-# LINE 578 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 578 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   QC.forAll (QC.choose (0,5)) $ \m ->
+   QC.forAll (QC.choose (0,5)) $ \n ->
+      Matrix.kronecker
+         (Matrix.identity (shapeInt m))
+         (Matrix.identity (shapeInt n))
+      ==
+      (Matrix.identity (shapeInt m, shapeInt n)
+         :: Matrix.Square (ShapeInt, ShapeInt) Number_)
+  )
diff --git a/test/Test/ComplexFloat/Numeric/BLAS/Vector.hs b/test/Test/ComplexFloat/Numeric/BLAS/Vector.hs
--- a/test/Test/ComplexFloat/Numeric/BLAS/Vector.hs
+++ b/test/Test/ComplexFloat/Numeric/BLAS/Vector.hs
@@ -11,6 +11,7 @@
 import     Test.Generator (genNumber)
 import     Test.Slice (shapeInt)
 import     Test.Utility (approx)
+import     qualified Numeric.BLAS.Matrix.RowMajor as Matrix
 import     qualified Numeric.BLAS.Vector as Vector
 import     qualified Numeric.Netlib.Class as Class
 import     qualified Data.Array.Comfort.Shape as Shape
@@ -102,215 +103,285 @@
 
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector:239: "
-{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:211: "
+{-# LINE 211 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 211 "src/Numeric/BLAS/Vector.hs" #-}
+      QC.forAll number_ $ \x -> Vector.constant () x == Vector.singleton x
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:213: "
+{-# LINE 213 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 213 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   QC.forAll number_ $ \x ->
+      Vector.sum (Vector.constant (shapeInt n) x) == fromIntegral n * x
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:225: "
+{-# LINE 225 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 225 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   Vector.sum (Vector.zero (shapeInt n)) == (0 :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:234: "
+{-# LINE 234 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 234 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   Vector.sum (Vector.one (shapeInt n)) == (fromIntegral n :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:243: "
+{-# LINE 243 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 243 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (fmap shapeInt $ QC.choose (1,1000)) $ \sh ->
+   QC.forAll (QC.elements $ Shape.indices sh) $ \k ->
+   Vector.sum (Vector.unit sh k) == (1 :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:265: "
+{-# LINE 265 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 265 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> forVector number_ $ \zs -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:248: "
-{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:274: "
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:249: "
-{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:275: "
+{-# LINE 275 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 275 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:250: "
-{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:276: "
+{-# LINE 276 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 276 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:252: "
-{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:278: "
+{-# LINE 278 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 278 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:253: "
-{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:279: "
+{-# LINE 279 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 279 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:254: "
-{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:280: "
+{-# LINE 280 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 280 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> Vector.reverse (xs <> ys) == Vector.reverse ys <> Vector.reverse xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:269: "
-{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:295: "
+{-# LINE 295 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 295 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList [])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:270: "
-{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:296: "
+{-# LINE 296 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 296 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:271: "
-{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:297: "
+{-# LINE 297 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 297 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:272: "
-{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:298: "
+{-# LINE 298 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 298 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1,6,5,4,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3,4,5,6])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:274: "
-{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:300: "
+{-# LINE 300 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 300 "src/Numeric/BLAS/Vector.hs" #-}
       forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:291: "
-{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:317: "
+{-# LINE 317 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
-      QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
+{-# LINE 317 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (1,100)) $ \dim ->
+   QC.forAll (QC.choose (0, dim-1)) $ \i ->
+   QC.forAll (QC.choose (0, dim-1)) $ \j ->
+      Vector.unit (Shape.ZeroBased dim) i
+      ==
+      (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:326: "
-{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:344: "
+{-# LINE 344 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 344 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   forVector2 number_ $ \xs ys ->
+      Vector.dot xs ys
+      ==
+      Matrix.multiply (Matrix.singleRow xs) (Matrix.singleColumn ys) ! ((),())
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:351: "
+{-# LINE 351 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 351 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   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_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:377: "
+{-# LINE 377 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 377 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:379: "
-{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:430: "
+{-# LINE 430 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 430 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:439: "
-{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:490: "
+{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:463: "
-{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:514: "
+{-# LINE 514 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example(
-{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 514 "src/Numeric/BLAS/Vector.hs" #-}
     Vector.argAbsMaximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
   )
   [ExpectedLine [LineChunk "(3,6.0 :+ 0.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:466: "
-{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:517: "
+{-# LINE 517 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 517 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:467: "
-{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:518: "
+{-# LINE 518 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 518 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:468: "
-{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:519: "
+{-# LINE 519 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 519 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:512: "
-{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:563: "
+{-# LINE 563 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example(
-{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 563 "src/Numeric/BLAS/Vector.hs" #-}
     Vector.argAbs1Maximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
   )
   [ExpectedLine [LineChunk "(1,3.0 :+ 4.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:515: "
-{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:566: "
+{-# LINE 566 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 566 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:548: "
-{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:599: "
+{-# LINE 599 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 599 "src/Numeric/BLAS/Vector.hs" #-}
       QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector (shapeInt dim) (genNumber 3)) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_)))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:558: "
-{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:609: "
+{-# LINE 609 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 609 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:559: "
-{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:610: "
+{-# LINE 610 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 610 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:560: "
-{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:611: "
+{-# LINE 611 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 611 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:576: "
-{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:627: "
+{-# LINE 627 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 627 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:606: "
-{-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:657: "
+{-# LINE 657 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 657 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:607: "
-{-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:658: "
+{-# LINE 658 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 658 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:676: "
-{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:727: "
+{-# LINE 727 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 727 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:677: "
-{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:728: "
+{-# LINE 728 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 728 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:707: "
-{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:758: "
+{-# LINE 758 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 758 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:720: "
-{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:771: "
+{-# LINE 771 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 771 "src/Numeric/BLAS/Vector.hs" #-}
       QC.forAll (genNumber maxElem) $ \d -> forVector number_ $ \xs -> xs == Vector.raise (-d) (Vector.raise d xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:737: "
-{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:788: "
+{-# LINE 788 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 788 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:745: "
-{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:796: "
+{-# LINE 796 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 796 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys
   )
diff --git a/test/Test/Double/Main.hs b/test/Test/Double/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Double/Main.hs
@@ -0,0 +1,14 @@
+-- Do not edit! Automatically created with doctest-extract.
+module Test.Double.Main where
+
+import qualified Test.Double.Numeric.BLAS.Matrix.RowMajor
+import qualified Test.Double.Numeric.BLAS.Vector.Slice
+import qualified Test.Double.Numeric.BLAS.Vector
+
+import qualified Test.DocTest.Driver as DocTest
+
+main :: DocTest.T ()
+main = do
+    Test.Double.Numeric.BLAS.Matrix.RowMajor.test
+    Test.Double.Numeric.BLAS.Vector.Slice.test
+    Test.Double.Numeric.BLAS.Vector.test
diff --git a/test/Test/Double/Numeric/BLAS/Matrix/RowMajor.hs b/test/Test/Double/Numeric/BLAS/Matrix/RowMajor.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Double/Numeric/BLAS/Matrix/RowMajor.hs
@@ -0,0 +1,254 @@
+-- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Matrix/RowMajor.hs
+{-# LINE 63 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+
+module Test.Double.Numeric.BLAS.Matrix.RowMajor where
+
+import Test.DocTest.Base
+import qualified Test.DocTest.Driver as DocTest
+
+{-# LINE 64 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+import     Test.Double.Type (Number_)
+import     Test.Double.Numeric.BLAS.Vector (forVector, genVector, number_)
+import     Test.Slice (ShapeInt, shapeInt)
+import     qualified Numeric.BLAS.Matrix.RowMajor as Matrix
+import     qualified Numeric.BLAS.Vector as Vector
+import     qualified Numeric.Netlib.Class as Class
+import     Numeric.BLAS.Scalar (RealOf)
+import     qualified Data.Array.Comfort.Storable as Array
+import     qualified Data.Array.Comfort.Shape as Shape
+import     qualified Test.QuickCheck as QC
+
+type     Matrix = Matrix.Matrix (Shape.ZeroBased Int) (Shape.ZeroBased Int)
+type     Real_ = RealOf Number_
+
+maxDim     :: Int
+maxDim     = 10
+
+forMatrix     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Matrix a -> prop) -> QC.Property
+forMatrix     genElem =
+       QC.forAll
+          (do height <- fmap shapeInt $ QC.choose (0,maxDim)
+              width <- fmap shapeInt $ QC.choose (0,maxDim)
+              genVector (height, width) genElem)
+
+genIdentityTrans     ::
+       (Shape.C sh, Class.Floating a) =>
+       sh -> QC.Gen (Matrix.Transposable sh sh a)
+genIdentityTrans     sh = do
+       trans <- QC.arbitrary
+       return $
+          if trans
+             then Matrix.transposed (Matrix.identity sh)
+             else Matrix.nonTransposed (Matrix.identity sh)
+
+transpose     ::
+       (Shape.C height, Eq height, Shape.C width, Class.Floating a) =>
+       Matrix.Matrix height width a -> Matrix.Matrix width height a
+transpose     a =
+       Matrix.multiplyTransposable
+          (Matrix.transposed a)
+          (Matrix.nonTransposed (Matrix.identity (Matrix.height a)))
+
+test :: DocTest.T ()
+test = do
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:129: "
+{-# LINE 129 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 129 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.identity (Shape.ZeroBased 0) :: Matrix.Square (Shape.ZeroBased Int) Real_
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (ZeroBased {",WildCardChunk,LineChunk " 0},ZeroBased {",WildCardChunk,LineChunk " 0}) []"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:131: "
+{-# LINE 131 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 131 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.identity (Shape.ZeroBased 3) :: Matrix.Square (Shape.ZeroBased Int) Real_
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (ZeroBased {",WildCardChunk,LineChunk " 3},ZeroBased {",WildCardChunk,LineChunk " 3}) [1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:339: "
+{-# LINE 339 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 339 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorLeft (Array.vectorFromList [3,1,4]) (Array.fromList (Shape.ZeroBased (3::Int), Shape.Range 'a' 'b') [0,1,0,0,1,0::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [4.0,3.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:342: "
+{-# LINE 342 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 342 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forVector number_ $ \xs ->
+   Matrix.multiplyVectorLeft xs (Matrix.identity (Array.shape xs)) == xs
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:353: "
+{-# LINE 353 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 353 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorRight (Array.fromList (Shape.Range 'a' 'b', Shape.ZeroBased (3::Int)) [0,0,1,1,0,0]) (Array.vectorFromList [3,1,4::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [4.0,3.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:355: "
+{-# LINE 355 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 355 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorRight (Array.fromList (Shape.Range 'a' 'b', Shape.ZeroBased (3::Int)) [2,7,1,8,2,8]) (Array.vectorFromList [3,1,4::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [17.0,58.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:358: "
+{-# LINE 358 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 358 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forVector number_ $ \xs ->
+   Matrix.multiplyVectorRight (Matrix.identity (Array.shape xs)) xs == xs
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:363: "
+{-# LINE 363 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 363 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \x ->
+   Matrix.singleColumn (Matrix.multiplyVectorRight a x)
+   ==
+   Matrix.multiply a (Matrix.singleColumn x)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:371: "
+{-# LINE 371 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 371 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (fst $ Array.shape a) number_) $ \x ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \y ->
+   Vector.dot x (Matrix.multiplyVectorRight a y)
+   ==
+   Vector.dot (Matrix.multiplyVectorLeft x a) y
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:380: "
+{-# LINE 380 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 380 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \x ->
+   Matrix.multiplyVectorRight a x
+   ==
+   Matrix.multiplyVectorLeft x (transpose a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:458: "
+{-# LINE 458 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 458 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.multiply
+      (Array.fromList (shapeInt 2, shapeInt 2) [1000,100,10,1])
+      (Array.fromList (shapeInt 2, shapeInt 3) [0..5::Real_])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [300.0,1400.0,2500.0,3.0,14.0,25.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:465: "
+{-# LINE 465 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 465 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+      Matrix.multiply (Matrix.identity (Matrix.height a)) a == a
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:469: "
+{-# LINE 469 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 469 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+      Matrix.multiply a (Matrix.identity (Matrix.width a)) == a
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:473: "
+{-# LINE 473 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 473 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   forMatrix number_ $ \c ->
+   QC.forAll (genVector (Matrix.width a, Matrix.height c) number_) $ \b ->
+      Matrix.multiply a (Matrix.multiply b c)
+      ==
+      Matrix.multiply (Matrix.multiply a b) c
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:488: "
+{-# LINE 488 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 488 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.height a)) $ \eye ->
+      a == Matrix.multiplyTransposable eye (Matrix.nonTransposed a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:493: "
+{-# LINE 493 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 493 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.width a)) $ \eye ->
+      a == Matrix.multiplyTransposable (Matrix.nonTransposed a) eye
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:498: "
+{-# LINE 498 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 498 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.width a)) $ \leftEye ->
+   QC.forAll (genIdentityTrans (Matrix.height a)) $ \rightEye ->
+      Matrix.multiplyTransposable leftEye (Matrix.transposed a)
+      ==
+      Matrix.multiplyTransposable (Matrix.transposed a) rightEye
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:506: "
+{-# LINE 506 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 506 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (QC.choose (0,maxDim)) $ \n ->
+   QC.forAll (genVector (Matrix.width a, shapeInt n) number_) $ \b ->
+      transpose (Matrix.multiply a b)
+      ==
+      Matrix.multiplyTransposable (Matrix.transposed b) (Matrix.transposed a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:564: "
+{-# LINE 564 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 564 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.kronecker
+      (Array.fromList (shapeInt 2, shapeInt 2) [0,1,-1,0::Real_])
+      (Array.fromList (shapeInt 2, shapeInt 3) [1..6])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [0.0,0.0,0.0,1.0,2.0,3.0,0.0,0.0,0.0,4.0,5.0,6.0,-1.0,-2.0,-3.0,0.0,0.0,0.0,-4.0,-5.0,-6.0,0.0,0.0,0.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:571: "
+{-# LINE 571 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 571 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.kronecker
+      (Array.fromList (shapeInt 2, shapeInt 2) [1,2,3,4::Real_])
+      (Array.fromList (shapeInt 2, shapeInt 3) [1,2,4,8,16,32])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [1.0,2.0,4.0,2.0,4.0,8.0,8.0,16.0,32.0,16.0,32.0,64.0,3.0,6.0,12.0,4.0,8.0,16.0,24.0,48.0,96.0,32.0,64.0,128.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:578: "
+{-# LINE 578 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 578 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   QC.forAll (QC.choose (0,5)) $ \m ->
+   QC.forAll (QC.choose (0,5)) $ \n ->
+      Matrix.kronecker
+         (Matrix.identity (shapeInt m))
+         (Matrix.identity (shapeInt n))
+      ==
+      (Matrix.identity (shapeInt m, shapeInt n)
+         :: Matrix.Square (ShapeInt, ShapeInt) Number_)
+  )
diff --git a/test/Test/Double/Numeric/BLAS/Vector.hs b/test/Test/Double/Numeric/BLAS/Vector.hs
--- a/test/Test/Double/Numeric/BLAS/Vector.hs
+++ b/test/Test/Double/Numeric/BLAS/Vector.hs
@@ -11,6 +11,7 @@
 import     Test.Generator (genNumber)
 import     Test.Slice (shapeInt)
 import     Test.Utility (approx)
+import     qualified Numeric.BLAS.Matrix.RowMajor as Matrix
 import     qualified Numeric.BLAS.Vector as Vector
 import     qualified Numeric.Netlib.Class as Class
 import     qualified Data.Array.Comfort.Shape as Shape
@@ -102,215 +103,285 @@
 
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector:239: "
-{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:211: "
+{-# LINE 211 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 211 "src/Numeric/BLAS/Vector.hs" #-}
+      QC.forAll number_ $ \x -> Vector.constant () x == Vector.singleton x
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:213: "
+{-# LINE 213 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 213 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   QC.forAll number_ $ \x ->
+      Vector.sum (Vector.constant (shapeInt n) x) == fromIntegral n * x
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:225: "
+{-# LINE 225 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 225 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   Vector.sum (Vector.zero (shapeInt n)) == (0 :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:234: "
+{-# LINE 234 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 234 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   Vector.sum (Vector.one (shapeInt n)) == (fromIntegral n :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:243: "
+{-# LINE 243 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 243 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (fmap shapeInt $ QC.choose (1,1000)) $ \sh ->
+   QC.forAll (QC.elements $ Shape.indices sh) $ \k ->
+   Vector.sum (Vector.unit sh k) == (1 :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:265: "
+{-# LINE 265 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 265 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> forVector number_ $ \zs -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:248: "
-{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:274: "
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:249: "
-{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:275: "
+{-# LINE 275 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 275 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:250: "
-{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:276: "
+{-# LINE 276 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 276 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:252: "
-{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:278: "
+{-# LINE 278 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 278 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:253: "
-{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:279: "
+{-# LINE 279 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 279 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:254: "
-{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:280: "
+{-# LINE 280 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 280 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> Vector.reverse (xs <> ys) == Vector.reverse ys <> Vector.reverse xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:269: "
-{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:295: "
+{-# LINE 295 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 295 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList [])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:270: "
-{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:296: "
+{-# LINE 296 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 296 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:271: "
-{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:297: "
+{-# LINE 297 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 297 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:272: "
-{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:298: "
+{-# LINE 298 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 298 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1,6,5,4,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3,4,5,6])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:274: "
-{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:300: "
+{-# LINE 300 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 300 "src/Numeric/BLAS/Vector.hs" #-}
       forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:291: "
-{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:317: "
+{-# LINE 317 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
-      QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
+{-# LINE 317 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (1,100)) $ \dim ->
+   QC.forAll (QC.choose (0, dim-1)) $ \i ->
+   QC.forAll (QC.choose (0, dim-1)) $ \j ->
+      Vector.unit (Shape.ZeroBased dim) i
+      ==
+      (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:326: "
-{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:344: "
+{-# LINE 344 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 344 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   forVector2 number_ $ \xs ys ->
+      Vector.dot xs ys
+      ==
+      Matrix.multiply (Matrix.singleRow xs) (Matrix.singleColumn ys) ! ((),())
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:351: "
+{-# LINE 351 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 351 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   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_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:377: "
+{-# LINE 377 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 377 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:379: "
-{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:430: "
+{-# LINE 430 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 430 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:439: "
-{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:490: "
+{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:463: "
-{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:514: "
+{-# LINE 514 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example(
-{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 514 "src/Numeric/BLAS/Vector.hs" #-}
     Vector.argAbsMaximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
   )
   [ExpectedLine [LineChunk "(3,6.0 :+ 0.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:466: "
-{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:517: "
+{-# LINE 517 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 517 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:467: "
-{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:518: "
+{-# LINE 518 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 518 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:468: "
-{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:519: "
+{-# LINE 519 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 519 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:512: "
-{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:563: "
+{-# LINE 563 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example(
-{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 563 "src/Numeric/BLAS/Vector.hs" #-}
     Vector.argAbs1Maximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
   )
   [ExpectedLine [LineChunk "(1,3.0 :+ 4.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:515: "
-{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:566: "
+{-# LINE 566 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 566 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:548: "
-{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:599: "
+{-# LINE 599 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 599 "src/Numeric/BLAS/Vector.hs" #-}
       QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector (shapeInt dim) (genNumber 3)) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_)))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:558: "
-{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:609: "
+{-# LINE 609 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 609 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:559: "
-{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:610: "
+{-# LINE 610 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 610 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:560: "
-{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:611: "
+{-# LINE 611 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 611 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:576: "
-{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:627: "
+{-# LINE 627 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 627 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:606: "
-{-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:657: "
+{-# LINE 657 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 657 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:607: "
-{-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:658: "
+{-# LINE 658 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 658 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:676: "
-{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:727: "
+{-# LINE 727 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 727 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:677: "
-{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:728: "
+{-# LINE 728 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 728 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:707: "
-{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:758: "
+{-# LINE 758 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 758 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:720: "
-{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:771: "
+{-# LINE 771 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 771 "src/Numeric/BLAS/Vector.hs" #-}
       QC.forAll (genNumber maxElem) $ \d -> forVector number_ $ \xs -> xs == Vector.raise (-d) (Vector.raise d xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:737: "
-{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:788: "
+{-# LINE 788 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 788 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:745: "
-{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:796: "
+{-# LINE 796 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 796 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys
   )
diff --git a/test/Test/Float/Main.hs b/test/Test/Float/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Float/Main.hs
@@ -0,0 +1,14 @@
+-- Do not edit! Automatically created with doctest-extract.
+module Test.Float.Main where
+
+import qualified Test.Float.Numeric.BLAS.Matrix.RowMajor
+import qualified Test.Float.Numeric.BLAS.Vector.Slice
+import qualified Test.Float.Numeric.BLAS.Vector
+
+import qualified Test.DocTest.Driver as DocTest
+
+main :: DocTest.T ()
+main = do
+    Test.Float.Numeric.BLAS.Matrix.RowMajor.test
+    Test.Float.Numeric.BLAS.Vector.Slice.test
+    Test.Float.Numeric.BLAS.Vector.test
diff --git a/test/Test/Float/Numeric/BLAS/Matrix/RowMajor.hs b/test/Test/Float/Numeric/BLAS/Matrix/RowMajor.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Float/Numeric/BLAS/Matrix/RowMajor.hs
@@ -0,0 +1,254 @@
+-- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Matrix/RowMajor.hs
+{-# LINE 63 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+
+module Test.Float.Numeric.BLAS.Matrix.RowMajor where
+
+import Test.DocTest.Base
+import qualified Test.DocTest.Driver as DocTest
+
+{-# LINE 64 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+import     Test.Float.Type (Number_)
+import     Test.Float.Numeric.BLAS.Vector (forVector, genVector, number_)
+import     Test.Slice (ShapeInt, shapeInt)
+import     qualified Numeric.BLAS.Matrix.RowMajor as Matrix
+import     qualified Numeric.BLAS.Vector as Vector
+import     qualified Numeric.Netlib.Class as Class
+import     Numeric.BLAS.Scalar (RealOf)
+import     qualified Data.Array.Comfort.Storable as Array
+import     qualified Data.Array.Comfort.Shape as Shape
+import     qualified Test.QuickCheck as QC
+
+type     Matrix = Matrix.Matrix (Shape.ZeroBased Int) (Shape.ZeroBased Int)
+type     Real_ = RealOf Number_
+
+maxDim     :: Int
+maxDim     = 10
+
+forMatrix     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Matrix a -> prop) -> QC.Property
+forMatrix     genElem =
+       QC.forAll
+          (do height <- fmap shapeInt $ QC.choose (0,maxDim)
+              width <- fmap shapeInt $ QC.choose (0,maxDim)
+              genVector (height, width) genElem)
+
+genIdentityTrans     ::
+       (Shape.C sh, Class.Floating a) =>
+       sh -> QC.Gen (Matrix.Transposable sh sh a)
+genIdentityTrans     sh = do
+       trans <- QC.arbitrary
+       return $
+          if trans
+             then Matrix.transposed (Matrix.identity sh)
+             else Matrix.nonTransposed (Matrix.identity sh)
+
+transpose     ::
+       (Shape.C height, Eq height, Shape.C width, Class.Floating a) =>
+       Matrix.Matrix height width a -> Matrix.Matrix width height a
+transpose     a =
+       Matrix.multiplyTransposable
+          (Matrix.transposed a)
+          (Matrix.nonTransposed (Matrix.identity (Matrix.height a)))
+
+test :: DocTest.T ()
+test = do
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:129: "
+{-# LINE 129 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 129 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.identity (Shape.ZeroBased 0) :: Matrix.Square (Shape.ZeroBased Int) Real_
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (ZeroBased {",WildCardChunk,LineChunk " 0},ZeroBased {",WildCardChunk,LineChunk " 0}) []"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:131: "
+{-# LINE 131 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 131 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.identity (Shape.ZeroBased 3) :: Matrix.Square (Shape.ZeroBased Int) Real_
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (ZeroBased {",WildCardChunk,LineChunk " 3},ZeroBased {",WildCardChunk,LineChunk " 3}) [1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:339: "
+{-# LINE 339 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 339 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorLeft (Array.vectorFromList [3,1,4]) (Array.fromList (Shape.ZeroBased (3::Int), Shape.Range 'a' 'b') [0,1,0,0,1,0::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [4.0,3.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:342: "
+{-# LINE 342 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 342 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forVector number_ $ \xs ->
+   Matrix.multiplyVectorLeft xs (Matrix.identity (Array.shape xs)) == xs
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:353: "
+{-# LINE 353 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 353 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorRight (Array.fromList (Shape.Range 'a' 'b', Shape.ZeroBased (3::Int)) [0,0,1,1,0,0]) (Array.vectorFromList [3,1,4::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [4.0,3.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:355: "
+{-# LINE 355 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 355 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+    Matrix.multiplyVectorRight (Array.fromList (Shape.Range 'a' 'b', Shape.ZeroBased (3::Int)) [2,7,1,8,2,8]) (Array.vectorFromList [3,1,4::Real_])
+  )
+  [ExpectedLine [LineChunk "StorableArray.fromList (Range {rangeFrom = 'a', rangeTo = 'b'}) [17.0,58.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:358: "
+{-# LINE 358 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 358 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forVector number_ $ \xs ->
+   Matrix.multiplyVectorRight (Matrix.identity (Array.shape xs)) xs == xs
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:363: "
+{-# LINE 363 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 363 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \x ->
+   Matrix.singleColumn (Matrix.multiplyVectorRight a x)
+   ==
+   Matrix.multiply a (Matrix.singleColumn x)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:371: "
+{-# LINE 371 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 371 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (fst $ Array.shape a) number_) $ \x ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \y ->
+   Vector.dot x (Matrix.multiplyVectorRight a y)
+   ==
+   Vector.dot (Matrix.multiplyVectorLeft x a) y
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:380: "
+{-# LINE 380 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 380 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genVector (snd $ Array.shape a) number_) $ \x ->
+   Matrix.multiplyVectorRight a x
+   ==
+   Matrix.multiplyVectorLeft x (transpose a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:458: "
+{-# LINE 458 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 458 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.multiply
+      (Array.fromList (shapeInt 2, shapeInt 2) [1000,100,10,1])
+      (Array.fromList (shapeInt 2, shapeInt 3) [0..5::Real_])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [300.0,1400.0,2500.0,3.0,14.0,25.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:465: "
+{-# LINE 465 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 465 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+      Matrix.multiply (Matrix.identity (Matrix.height a)) a == a
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:469: "
+{-# LINE 469 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 469 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+      Matrix.multiply a (Matrix.identity (Matrix.width a)) == a
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:473: "
+{-# LINE 473 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 473 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   forMatrix number_ $ \c ->
+   QC.forAll (genVector (Matrix.width a, Matrix.height c) number_) $ \b ->
+      Matrix.multiply a (Matrix.multiply b c)
+      ==
+      Matrix.multiply (Matrix.multiply a b) c
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:488: "
+{-# LINE 488 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 488 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.height a)) $ \eye ->
+      a == Matrix.multiplyTransposable eye (Matrix.nonTransposed a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:493: "
+{-# LINE 493 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 493 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.width a)) $ \eye ->
+      a == Matrix.multiplyTransposable (Matrix.nonTransposed a) eye
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:498: "
+{-# LINE 498 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 498 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (genIdentityTrans (Matrix.width a)) $ \leftEye ->
+   QC.forAll (genIdentityTrans (Matrix.height a)) $ \rightEye ->
+      Matrix.multiplyTransposable leftEye (Matrix.transposed a)
+      ==
+      Matrix.multiplyTransposable (Matrix.transposed a) rightEye
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:506: "
+{-# LINE 506 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 506 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   forMatrix number_ $ \a ->
+   QC.forAll (QC.choose (0,maxDim)) $ \n ->
+   QC.forAll (genVector (Matrix.width a, shapeInt n) number_) $ \b ->
+      transpose (Matrix.multiply a b)
+      ==
+      Matrix.multiplyTransposable (Matrix.transposed b) (Matrix.transposed a)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:564: "
+{-# LINE 564 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 564 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.kronecker
+      (Array.fromList (shapeInt 2, shapeInt 2) [0,1,-1,0::Real_])
+      (Array.fromList (shapeInt 2, shapeInt 3) [1..6])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [0.0,0.0,0.0,1.0,2.0,3.0,0.0,0.0,0.0,4.0,5.0,6.0,-1.0,-2.0,-3.0,0.0,0.0,0.0,-4.0,-5.0,-6.0,0.0,0.0,0.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:571: "
+{-# LINE 571 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.example(
+{-# LINE 571 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+      
+   Matrix.kronecker
+      (Array.fromList (shapeInt 2, shapeInt 2) [1,2,3,4::Real_])
+      (Array.fromList (shapeInt 2, shapeInt 3) [1,2,4,8,16,32])
+  )
+  [ExpectedLine [WildCardChunk,LineChunk " [1.0,2.0,4.0,2.0,4.0,8.0,8.0,16.0,32.0,16.0,32.0,64.0,3.0,6.0,12.0,4.0,8.0,16.0,24.0,48.0,96.0,32.0,64.0,128.0]"]]
+ DocTest.printPrefix "Numeric.BLAS.Matrix.RowMajor:578: "
+{-# LINE 578 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+ DocTest.property(
+{-# LINE 578 "src/Numeric/BLAS/Matrix/RowMajor.hs" #-}
+        
+   QC.forAll (QC.choose (0,5)) $ \m ->
+   QC.forAll (QC.choose (0,5)) $ \n ->
+      Matrix.kronecker
+         (Matrix.identity (shapeInt m))
+         (Matrix.identity (shapeInt n))
+      ==
+      (Matrix.identity (shapeInt m, shapeInt n)
+         :: Matrix.Square (ShapeInt, ShapeInt) Number_)
+  )
diff --git a/test/Test/Float/Numeric/BLAS/Vector.hs b/test/Test/Float/Numeric/BLAS/Vector.hs
--- a/test/Test/Float/Numeric/BLAS/Vector.hs
+++ b/test/Test/Float/Numeric/BLAS/Vector.hs
@@ -11,6 +11,7 @@
 import     Test.Generator (genNumber)
 import     Test.Slice (shapeInt)
 import     Test.Utility (approx)
+import     qualified Numeric.BLAS.Matrix.RowMajor as Matrix
 import     qualified Numeric.BLAS.Vector as Vector
 import     qualified Numeric.Netlib.Class as Class
 import     qualified Data.Array.Comfort.Shape as Shape
@@ -102,215 +103,285 @@
 
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector:239: "
-{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:211: "
+{-# LINE 211 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 211 "src/Numeric/BLAS/Vector.hs" #-}
+      QC.forAll number_ $ \x -> Vector.constant () x == Vector.singleton x
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:213: "
+{-# LINE 213 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 213 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   QC.forAll number_ $ \x ->
+      Vector.sum (Vector.constant (shapeInt n) x) == fromIntegral n * x
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:225: "
+{-# LINE 225 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 225 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   Vector.sum (Vector.zero (shapeInt n)) == (0 :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:234: "
+{-# LINE 234 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 234 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (0,1000)) $ \n ->
+   Vector.sum (Vector.one (shapeInt n)) == (fromIntegral n :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:243: "
+{-# LINE 243 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 243 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (fmap shapeInt $ QC.choose (1,1000)) $ \sh ->
+   QC.forAll (QC.elements $ Shape.indices sh) $ \k ->
+   Vector.sum (Vector.unit sh k) == (1 :: Number_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:265: "
+{-# LINE 265 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 265 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> forVector number_ $ \zs -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:248: "
-{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:274: "
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:249: "
-{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:275: "
+{-# LINE 275 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 275 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:250: "
-{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:276: "
+{-# LINE 276 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 276 "src/Numeric/BLAS/Vector.hs" #-}
       Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:252: "
-{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:278: "
+{-# LINE 278 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 278 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:253: "
-{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:279: "
+{-# LINE 279 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 279 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:254: "
-{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:280: "
+{-# LINE 280 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 280 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> Vector.reverse (xs <> ys) == Vector.reverse ys <> Vector.reverse xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:269: "
-{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:295: "
+{-# LINE 295 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 295 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList [])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:270: "
-{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:296: "
+{-# LINE 296 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 296 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:271: "
-{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:297: "
+{-# LINE 297 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 297 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:272: "
-{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:298: "
+{-# LINE 298 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 298 "src/Numeric/BLAS/Vector.hs" #-}
       cyclicVectorFromList [1,6,5,4,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3,4,5,6])
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:274: "
-{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:300: "
+{-# LINE 300 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 300 "src/Numeric/BLAS/Vector.hs" #-}
       forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:291: "
-{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:317: "
+{-# LINE 317 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
-      QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
+{-# LINE 317 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   QC.forAll (QC.choose (1,100)) $ \dim ->
+   QC.forAll (QC.choose (0, dim-1)) $ \i ->
+   QC.forAll (QC.choose (0, dim-1)) $ \j ->
+      Vector.unit (Shape.ZeroBased dim) i
+      ==
+      (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:326: "
-{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:344: "
+{-# LINE 344 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 344 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   forVector2 number_ $ \xs ys ->
+      Vector.dot xs ys
+      ==
+      Matrix.multiply (Matrix.singleRow xs) (Matrix.singleColumn ys) ! ((),())
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:351: "
+{-# LINE 351 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 351 "src/Numeric/BLAS/Vector.hs" #-}
+        
+   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_)
+  )
+ DocTest.printPrefix "Numeric.BLAS.Vector:377: "
+{-# LINE 377 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property(
+{-# LINE 377 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:379: "
-{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:430: "
+{-# LINE 430 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 430 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:439: "
-{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:490: "
+{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:463: "
-{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:514: "
+{-# LINE 514 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example(
-{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 514 "src/Numeric/BLAS/Vector.hs" #-}
     Vector.argAbsMaximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
   )
   [ExpectedLine [LineChunk "(3,6.0 :+ 0.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:466: "
-{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:517: "
+{-# LINE 517 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 517 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:467: "
-{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:518: "
+{-# LINE 518 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 518 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:468: "
-{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:519: "
+{-# LINE 519 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 519 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> forVector number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:512: "
-{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:563: "
+{-# LINE 563 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example(
-{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 563 "src/Numeric/BLAS/Vector.hs" #-}
     Vector.argAbs1Maximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
   )
   [ExpectedLine [LineChunk "(1,3.0 :+ 4.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:515: "
-{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:566: "
+{-# LINE 566 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 566 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:548: "
-{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:599: "
+{-# LINE 599 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 599 "src/Numeric/BLAS/Vector.hs" #-}
       QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector (shapeInt dim) (genNumber 3)) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_)))
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:558: "
-{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:609: "
+{-# LINE 609 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 609 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:559: "
-{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:610: "
+{-# LINE 610 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 610 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:560: "
-{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:611: "
+{-# LINE 611 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 611 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:576: "
-{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:627: "
+{-# LINE 627 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 627 "src/Numeric/BLAS/Vector.hs" #-}
       forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:606: "
-{-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:657: "
+{-# LINE 657 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 657 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:607: "
-{-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:658: "
+{-# LINE 658 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 658 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:676: "
-{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:727: "
+{-# LINE 727 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 727 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:677: "
-{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:728: "
+{-# LINE 728 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 728 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:707: "
-{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:758: "
+{-# LINE 758 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 758 "src/Numeric/BLAS/Vector.hs" #-}
       forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:720: "
-{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:771: "
+{-# LINE 771 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 771 "src/Numeric/BLAS/Vector.hs" #-}
       QC.forAll (genNumber maxElem) $ \d -> forVector number_ $ \xs -> xs == Vector.raise (-d) (Vector.raise d xs)
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:737: "
-{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:788: "
+{-# LINE 788 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 788 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs
   )
- DocTest.printPrefix "Numeric.BLAS.Vector:745: "
-{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:796: "
+{-# LINE 796 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property(
-{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 796 "src/Numeric/BLAS/Vector.hs" #-}
       forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys
   )
