summaryrefslogtreecommitdiff
path: root/packages/base/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/base/src')
-rw-r--r--packages/base/src/C/vector-aux.c114
-rw-r--r--packages/base/src/Data/Packed/Internal/Matrix.hs3
-rw-r--r--packages/base/src/Data/Packed/Matrix.hs6
-rw-r--r--packages/base/src/Data/Packed/Numeric.hs24
-rw-r--r--packages/base/src/Numeric/LinearAlgebra/Algorithms.hs9
-rw-r--r--packages/base/src/Numeric/LinearAlgebra/Data.hs4
-rw-r--r--packages/base/src/Numeric/LinearAlgebra/HMatrix.hs34
-rw-r--r--packages/base/src/Numeric/LinearAlgebra/Static.hs10
-rw-r--r--packages/base/src/Numeric/LinearAlgebra/Static/Internal.hs2
-rw-r--r--packages/base/src/Numeric/LinearAlgebra/Util.hs44
-rw-r--r--packages/base/src/Numeric/LinearAlgebra/Util/Convolution.hs3
11 files changed, 216 insertions, 37 deletions
diff --git a/packages/base/src/C/vector-aux.c b/packages/base/src/C/vector-aux.c
index 2f47c8f..dda47cb 100644
--- a/packages/base/src/C/vector-aux.c
+++ b/packages/base/src/C/vector-aux.c
@@ -172,7 +172,7 @@ double vector_min(KDVEC(x)) {
172double vector_max_index(KDVEC(x)) { 172double vector_max_index(KDVEC(x)) {
173 int k, r = 0; 173 int k, r = 0;
174 for (k = 1; k<xn; k++) { 174 for (k = 1; k<xn; k++) {
175 if(xp[k]>xp[0]) { 175 if(xp[k]>xp[r]) {
176 r = k; 176 r = k;
177 } 177 }
178 } 178 }
@@ -182,7 +182,7 @@ double vector_max_index(KDVEC(x)) {
182double vector_min_index(KDVEC(x)) { 182double vector_min_index(KDVEC(x)) {
183 int k, r = 0; 183 int k, r = 0;
184 for (k = 1; k<xn; k++) { 184 for (k = 1; k<xn; k++) {
185 if(xp[k]<xp[0]) { 185 if(xp[k]<xp[r]) {
186 r = k; 186 r = k;
187 } 187 }
188 } 188 }
@@ -237,7 +237,7 @@ float vector_min_f(KFVEC(x)) {
237float vector_max_index_f(KFVEC(x)) { 237float vector_max_index_f(KFVEC(x)) {
238 int k, r = 0; 238 int k, r = 0;
239 for (k = 1; k<xn; k++) { 239 for (k = 1; k<xn; k++) {
240 if(xp[k]>xp[0]) { 240 if(xp[k]>xp[r]) {
241 r = k; 241 r = k;
242 } 242 }
243 } 243 }
@@ -247,7 +247,7 @@ float vector_max_index_f(KFVEC(x)) {
247float vector_min_index_f(KFVEC(x)) { 247float vector_min_index_f(KFVEC(x)) {
248 int k, r = 0; 248 int k, r = 0;
249 for (k = 1; k<xn; k++) { 249 for (k = 1; k<xn; k++) {
250 if(xp[k]<xp[0]) { 250 if(xp[k]<xp[r]) {
251 r = k; 251 r = k;
252 } 252 }
253 } 253 }
@@ -700,17 +700,86 @@ int saveMatrix(char * file, char * format, KDMAT(a)){
700 700
701//////////////////////////////////////////////////////////////////////////////// 701////////////////////////////////////////////////////////////////////////////////
702 702
703#ifdef __APPLE__
704
705#pragma message "randomVector is not thread-safe in OSX"
706
707inline double urandom() {
708 const long max_random = 2147483647; // 2**31 - 1
709 return (double)random() / (double)max_random;
710}
711
712double gaussrand(int *phase, double *pV1, double *pV2, double *pS)
713{
714 double V1=*pV1, V2=*pV2, S=*pS;
715 double X;
716
717 if(*phase == 0) {
718 do {
719 double U1 = urandom();
720 double U2 = urandom();
721
722 V1 = 2 * U1 - 1;
723 V2 = 2 * U2 - 1;
724 S = V1 * V1 + V2 * V2;
725 } while(S >= 1 || S == 0);
726
727 X = V1 * sqrt(-2 * log(S) / S);
728 } else
729 X = V2 * sqrt(-2 * log(S) / S);
730
731 *phase = 1 - *phase;
732 *pV1=V1; *pV2=V2; *pS=S;
733
734 return X;
735
736}
737
738int random_vector(unsigned int seed, int code, DVEC(r)) {
739 int phase = 0;
740 double V1,V2,S;
741
742 srandom(seed);
743
744 int k;
745 switch (code) {
746 case 0: { // uniform
747 for (k=0; k<rn; k++) {
748 rp[k] = urandom();
749 }
750 OK
751 }
752 case 1: { // gaussian
753 for (k=0; k<rn; k++) {
754 rp[k] = gaussrand(&phase,&V1,&V2,&S);
755 }
756 OK
757 }
758
759 default: ERROR(BAD_CODE);
760 }
761}
762
763#else
764
765inline double urandom(struct random_data * buffer) {
766 int32_t res;
767 random_r(buffer,&res);
768 return (double)res/RAND_MAX;
769}
770
771
703// http://c-faq.com/lib/gaussian.html 772// http://c-faq.com/lib/gaussian.html
704double gaussrand() 773double gaussrand(struct random_data *buffer,
774 int *phase, double *pV1, double *pV2, double *pS)
705{ 775{
706 static double V1, V2, S; 776 double V1=*pV1, V2=*pV2, S=*pS;
707 static int phase = 0;
708 double X; 777 double X;
709 778
710 if(phase == 0) { 779 if(*phase == 0) {
711 do { 780 do {
712 double U1 = (double)rand() / RAND_MAX; 781 double U1 = urandom(buffer);
713 double U2 = (double)rand() / RAND_MAX; 782 double U2 = urandom(buffer);
714 783
715 V1 = 2 * U1 - 1; 784 V1 = 2 * U1 - 1;
716 V2 = 2 * U2 - 1; 785 V2 = 2 * U2 - 1;
@@ -721,24 +790,37 @@ double gaussrand()
721 } else 790 } else
722 X = V2 * sqrt(-2 * log(S) / S); 791 X = V2 * sqrt(-2 * log(S) / S);
723 792
724 phase = 1 - phase; 793 *phase = 1 - *phase;
794 *pV1=V1; *pV2=V2; *pS=S;
725 795
726 return X; 796 return X;
797
727} 798}
728 799
729int random_vector(int seed, int code, DVEC(r)) { 800int random_vector(unsigned int seed, int code, DVEC(r)) {
730 srand(seed); 801 struct random_data buffer;
802 char random_state[128];
803 memset(&buffer, 0, sizeof(struct random_data));
804 memset(random_state, 0, sizeof(random_state));
805
806 initstate_r(seed,random_state,sizeof(random_state),&buffer);
807 // setstate_r(random_state,&buffer);
808 // srandom_r(seed,&buffer);
809
810 int phase = 0;
811 double V1,V2,S;
812
731 int k; 813 int k;
732 switch (code) { 814 switch (code) {
733 case 0: { // uniform 815 case 0: { // uniform
734 for (k=0; k<rn; k++) { 816 for (k=0; k<rn; k++) {
735 rp[k] = (double)rand()/RAND_MAX; 817 rp[k] = urandom(&buffer);
736 } 818 }
737 OK 819 OK
738 } 820 }
739 case 1: { // gaussian 821 case 1: { // gaussian
740 for (k=0; k<rn; k++) { 822 for (k=0; k<rn; k++) {
741 rp[k] = gaussrand(); 823 rp[k] = gaussrand(&buffer,&phase,&V1,&V2,&S);
742 } 824 }
743 OK 825 OK
744 } 826 }
@@ -747,6 +829,8 @@ int random_vector(int seed, int code, DVEC(r)) {
747 } 829 }
748} 830}
749 831
832#endif
833
750//////////////////////////////////////////////////////////////////////////////// 834////////////////////////////////////////////////////////////////////////////////
751 835
752int smXv(KDVEC(vals),KIVEC(cols),KIVEC(rows),KDVEC(x),DVEC(r)) { 836int smXv(KDVEC(vals),KIVEC(cols),KIVEC(rows),KDVEC(x),DVEC(r)) {
diff --git a/packages/base/src/Data/Packed/Internal/Matrix.hs b/packages/base/src/Data/Packed/Internal/Matrix.hs
index 91a9466..150b978 100644
--- a/packages/base/src/Data/Packed/Internal/Matrix.hs
+++ b/packages/base/src/Data/Packed/Internal/Matrix.hs
@@ -253,7 +253,8 @@ compat m1 m2 = rows m1 == rows m2 && cols m1 == cols m2
253 operations for selected element types. 253 operations for selected element types.
254 It provides unoptimised defaults for any 'Storable' type, 254 It provides unoptimised defaults for any 'Storable' type,
255 so you can create instances simply as: 255 so you can create instances simply as:
256 @instance Element Foo@. 256
257 >instance Element Foo
257-} 258-}
258class (Storable a) => Element a where 259class (Storable a) => Element a where
259 subMatrixD :: (Int,Int) -- ^ (r0,c0) starting position 260 subMatrixD :: (Int,Int) -- ^ (r0,c0) starting position
diff --git a/packages/base/src/Data/Packed/Matrix.hs b/packages/base/src/Data/Packed/Matrix.hs
index 6445ce4..70b9232 100644
--- a/packages/base/src/Data/Packed/Matrix.hs
+++ b/packages/base/src/Data/Packed/Matrix.hs
@@ -284,7 +284,7 @@ fromLists = fromRows . map fromList
284-- [ 1.0, 2.0, 3.0, 4.0, 5.0 ] 284-- [ 1.0, 2.0, 3.0, 4.0, 5.0 ]
285-- 285--
286asRow :: Storable a => Vector a -> Matrix a 286asRow :: Storable a => Vector a -> Matrix a
287asRow v = reshape (dim v) v 287asRow = trans . asColumn
288 288
289-- | creates a 1-column matrix from a vector 289-- | creates a 1-column matrix from a vector
290-- 290--
@@ -297,7 +297,7 @@ asRow v = reshape (dim v) v
297-- , 5.0 ] 297-- , 5.0 ]
298-- 298--
299asColumn :: Storable a => Vector a -> Matrix a 299asColumn :: Storable a => Vector a -> Matrix a
300asColumn = trans . asRow 300asColumn v = reshape 1 v
301 301
302 302
303 303
@@ -476,7 +476,7 @@ mapMatrixWithIndexM g m = liftM (reshape c) . mapVectorWithIndexM (mk c g) . fla
476 476
477{- | 477{- |
478 478
479>>> mapMatrixWithIndex (\\(i,j) v -> 100*v + 10*fromIntegral i + fromIntegral j) (ident 3:: Matrix Double) 479>>> mapMatrixWithIndex (\(i,j) v -> 100*v + 10*fromIntegral i + fromIntegral j) (ident 3:: Matrix Double)
480(3><3) 480(3><3)
481 [ 100.0, 1.0, 2.0 481 [ 100.0, 1.0, 2.0
482 , 10.0, 111.0, 12.0 482 , 10.0, 111.0, 12.0
diff --git a/packages/base/src/Data/Packed/Numeric.hs b/packages/base/src/Data/Packed/Numeric.hs
index 7aa53f1..6027f43 100644
--- a/packages/base/src/Data/Packed/Numeric.hs
+++ b/packages/base/src/Data/Packed/Numeric.hs
@@ -160,7 +160,29 @@ instance Mul Vector Matrix Vector where
160 160
161-------------------------------------------------------------------------------- 161--------------------------------------------------------------------------------
162 162
163-- | least squares solution of a linear system, similar to the \\ operator of Matlab\/Octave (based on linearSolveSVD) 163{- | Least squares solution of a linear system, similar to the \\ operator of Matlab\/Octave (based on linearSolveSVD)
164
165@
166a = (3><2)
167 [ 1.0, 2.0
168 , 2.0, 4.0
169 , 2.0, -1.0 ]
170@
171
172@
173v = vector [13.0,27.0,1.0]
174@
175
176>>> let x = a <\> v
177>>> x
178fromList [3.0799999999999996,5.159999999999999]
179
180>>> a #> x
181fromList [13.399999999999999,26.799999999999997,1.0]
182
183It also admits multiple right-hand sides stored as columns in a matrix.
184
185-}
164infixl 7 <\> 186infixl 7 <\>
165(<\>) :: (LSDiv c, Field t) => Matrix t -> c t -> c t 187(<\>) :: (LSDiv c, Field t) => Matrix t -> c t -> c t
166(<\>) = linSolve 188(<\>) = linSolve
diff --git a/packages/base/src/Numeric/LinearAlgebra/Algorithms.hs b/packages/base/src/Numeric/LinearAlgebra/Algorithms.hs
index 25700bc..02ac6a0 100644
--- a/packages/base/src/Numeric/LinearAlgebra/Algorithms.hs
+++ b/packages/base/src/Numeric/LinearAlgebra/Algorithms.hs
@@ -809,7 +809,7 @@ expGolub m = iterate msq f !! j
809-------------------------------------------------------------- 809--------------------------------------------------------------
810 810
811{- | Matrix square root. Currently it uses a simple iterative algorithm described in Wikipedia. 811{- | Matrix square root. Currently it uses a simple iterative algorithm described in Wikipedia.
812It only works with invertible matrices that have a real solution. For diagonalizable matrices you can try @matFunc sqrt@. 812It only works with invertible matrices that have a real solution.
813 813
814@m = (2><2) [4,9 814@m = (2><2) [4,9
815 ,0,4] :: Matrix Double@ 815 ,0,4] :: Matrix Double@
@@ -819,6 +819,13 @@ It only works with invertible matrices that have a real solution. For diagonaliz
819 [ 2.0, 2.25 819 [ 2.0, 2.25
820 , 0.0, 2.0 ] 820 , 0.0, 2.0 ]
821 821
822For diagonalizable matrices you can try 'matFunc' @sqrt@:
823
824>>> matFunc sqrt ((2><2) [1,0,0,-1])
825(2><2)
826 [ 1.0 :+ 0.0, 0.0 :+ 0.0
827 , 0.0 :+ 0.0, 0.0 :+ 1.0 ]
828
822-} 829-}
823sqrtm :: Field t => Matrix t -> Matrix t 830sqrtm :: Field t => Matrix t -> Matrix t
824sqrtm = sqrtmInv 831sqrtm = sqrtmInv
diff --git a/packages/base/src/Numeric/LinearAlgebra/Data.hs b/packages/base/src/Numeric/LinearAlgebra/Data.hs
index b1a31fc..6dea407 100644
--- a/packages/base/src/Numeric/LinearAlgebra/Data.hs
+++ b/packages/base/src/Numeric/LinearAlgebra/Data.hs
@@ -40,7 +40,7 @@ module Numeric.LinearAlgebra.Data(
40 takeRows, dropRows, takeColumns, dropColumns, subMatrix, (?), (¿), fliprl, flipud, 40 takeRows, dropRows, takeColumns, dropColumns, subMatrix, (?), (¿), fliprl, flipud,
41 41
42 -- * Block matrix 42 -- * Block matrix
43 fromBlocks, (¦), (——), diagBlock, repmat, toBlocks, toBlocksEvery, 43 fromBlocks, (|||), (===), diagBlock, repmat, toBlocks, toBlocksEvery,
44 44
45 -- * Mapping functions 45 -- * Mapping functions
46 conj, cmap, step, cond, 46 conj, cmap, step, cond,
@@ -66,7 +66,7 @@ module Numeric.LinearAlgebra.Data(
66 arctan2, 66 arctan2,
67 rows, cols, 67 rows, cols,
68 separable, 68 separable,
69 69 (¦),(——),
70 module Data.Complex, 70 module Data.Complex,
71 71
72 Vector, Matrix, GMatrix, nRows, nCols 72 Vector, Matrix, GMatrix, nRows, nCols
diff --git a/packages/base/src/Numeric/LinearAlgebra/HMatrix.hs b/packages/base/src/Numeric/LinearAlgebra/HMatrix.hs
index d2cae6c..677f9ee 100644
--- a/packages/base/src/Numeric/LinearAlgebra/HMatrix.hs
+++ b/packages/base/src/Numeric/LinearAlgebra/HMatrix.hs
@@ -134,7 +134,7 @@ module Numeric.LinearAlgebra.HMatrix (
134 Seed, RandDist(..), randomVector, rand, randn, gaussianSample, uniformSample, 134 Seed, RandDist(..), randomVector, rand, randn, gaussianSample, uniformSample,
135 135
136 -- * Misc 136 -- * Misc
137 meanCov, peps, relativeError, haussholder, optimiseMult, udot, nullspaceSVD, orthSVD, ranksv, 137 meanCov, rowOuters, peps, relativeError, haussholder, optimiseMult, udot, nullspaceSVD, orthSVD, ranksv,
138 ℝ,ℂ,iC, 138 ℝ,ℂ,iC,
139 -- * Auxiliary classes 139 -- * Auxiliary classes
140 Element, Container, Product, Numeric, LSDiv, 140 Element, Container, Product, Numeric, LSDiv,
@@ -194,7 +194,37 @@ mul :: Numeric t => Matrix t -> Matrix t -> Matrix t
194mul = mXm 194mul = mXm
195 195
196 196
197-- | Solve a linear system (for square coefficient matrix and several right-hand sides) using the LU decomposition, returning Nothing for a singular system. For underconstrained or overconstrained systems use 'linearSolveLS' or 'linearSolveSVD'. 197{- | Solve a linear system (for square coefficient matrix and several right-hand sides) using the LU decomposition, returning Nothing for a singular system. For underconstrained or overconstrained systems use 'linearSolveLS' or 'linearSolveSVD'.
198
199@
200a = (2><2)
201 [ 1.0, 2.0
202 , 3.0, 5.0 ]
203@
204
205@
206b = (2><3)
207 [ 6.0, 1.0, 10.0
208 , 15.0, 3.0, 26.0 ]
209@
210
211>>> linearSolve a b
212Just (2><3)
213 [ -1.4802973661668753e-15, 0.9999999999999997, 1.999999999999997
214 , 3.000000000000001, 1.6653345369377348e-16, 4.000000000000002 ]
215
216>>> let Just x = it
217>>> disp 5 x
2182x3
219-0.00000 1.00000 2.00000
220 3.00000 0.00000 4.00000
221
222>>> a <> x
223(2><3)
224 [ 6.0, 1.0, 10.0
225 , 15.0, 3.0, 26.0 ]
226
227-}
198linearSolve m b = A.mbLinearSolve m b 228linearSolve m b = A.mbLinearSolve m b
199 229
200-- | return an orthonormal basis of the null space of a matrix. See also 'nullspaceSVD'. 230-- | return an orthonormal basis of the null space of a matrix. See also 'nullspaceSVD'.
diff --git a/packages/base/src/Numeric/LinearAlgebra/Static.hs b/packages/base/src/Numeric/LinearAlgebra/Static.hs
index 5749c40..037396d 100644
--- a/packages/base/src/Numeric/LinearAlgebra/Static.hs
+++ b/packages/base/src/Numeric/LinearAlgebra/Static.hs
@@ -512,7 +512,10 @@ crossC (extract -> x) (extract -> y) = mkC (LA.fromList [z1, z2, z3])
512-------------------------------------------------------------------------------- 512--------------------------------------------------------------------------------
513 513
514diagRectR :: forall m n k . (KnownNat m, KnownNat n, KnownNat k) => ℝ -> R k -> L m n 514diagRectR :: forall m n k . (KnownNat m, KnownNat n, KnownNat k) => ℝ -> R k -> L m n
515diagRectR x v = r 515diagRectR x v
516 | m' == 1 = mkL (LA.diagRect x ev m' n')
517 | m'*n' > 0 = r
518 | otherwise = matrix []
516 where 519 where
517 r = mkL (asRow (vjoin [scalar x, ev, zeros])) 520 r = mkL (asRow (vjoin [scalar x, ev, zeros]))
518 ev = extract v 521 ev = extract v
@@ -521,7 +524,10 @@ diagRectR x v = r
521 524
522 525
523diagRectC :: forall m n k . (KnownNat m, KnownNat n, KnownNat k) => ℂ -> C k -> M m n 526diagRectC :: forall m n k . (KnownNat m, KnownNat n, KnownNat k) => ℂ -> C k -> M m n
524diagRectC x v = r 527diagRectC x v
528 | m' == 1 = mkM (LA.diagRect x ev m' n')
529 | m'*n' > 0 = r
530 | otherwise = fromList []
525 where 531 where
526 r = mkM (asRow (vjoin [scalar x, ev, zeros])) 532 r = mkM (asRow (vjoin [scalar x, ev, zeros]))
527 ev = extract v 533 ev = extract v
diff --git a/packages/base/src/Numeric/LinearAlgebra/Static/Internal.hs b/packages/base/src/Numeric/LinearAlgebra/Static/Internal.hs
index 339ef7d..ec02cf6 100644
--- a/packages/base/src/Numeric/LinearAlgebra/Static/Internal.hs
+++ b/packages/base/src/Numeric/LinearAlgebra/Static/Internal.hs
@@ -150,7 +150,7 @@ gmat st xs'
150 (xs,rest) = splitAt (m'*n') xs' 150 (xs,rest) = splitAt (m'*n') xs'
151 v = LA.fromList xs 151 v = LA.fromList xs
152 x = reshape n' v 152 x = reshape n' v
153 ok = rem (LA.size v) n' == 0 && LA.size x == (m',n') && null rest 153 ok = null rest && ((n' == 0 && dim v == 0) || n'> 0 && (rem (LA.size v) n' == 0) && LA.size x == (m',n'))
154 m' = fromIntegral . natVal $ (undefined :: Proxy m) :: Int 154 m' = fromIntegral . natVal $ (undefined :: Proxy m) :: Int
155 n' = fromIntegral . natVal $ (undefined :: Proxy n) :: Int 155 n' = fromIntegral . natVal $ (undefined :: Proxy n) :: Int
156 abort info = error $ st ++" "++show m' ++ " " ++ show n'++" can't be created from elements " ++ info 156 abort info = error $ st ++" "++show m' ++ " " ++ show n'++" can't be created from elements " ++ info
diff --git a/packages/base/src/Numeric/LinearAlgebra/Util.hs b/packages/base/src/Numeric/LinearAlgebra/Util.hs
index 6bb9d15..043aa21 100644
--- a/packages/base/src/Numeric/LinearAlgebra/Util.hs
+++ b/packages/base/src/Numeric/LinearAlgebra/Util.hs
@@ -33,7 +33,7 @@ module Numeric.LinearAlgebra.Util(
33 diagl, 33 diagl,
34 row, 34 row,
35 col, 35 col,
36 (&), (¦), (——), (#), 36 (&), (¦), (|||), (——), (===), (#),
37 (?), (¿), 37 (?), (¿),
38 Indexable(..), size, 38 Indexable(..), size,
39 Numeric, 39 Numeric,
@@ -157,25 +157,34 @@ a & b = vjoin [a,b]
157 157
158{- | horizontal concatenation of real matrices 158{- | horizontal concatenation of real matrices
159 159
160 (unicode 0x00a6, broken bar) 160>>> ident 3 ||| konst 7 (3,4)
161
162>>> ident 3 ¦ konst 7 (3,4)
163(3><7) 161(3><7)
164 [ 1.0, 0.0, 0.0, 7.0, 7.0, 7.0, 7.0 162 [ 1.0, 0.0, 0.0, 7.0, 7.0, 7.0, 7.0
165 , 0.0, 1.0, 0.0, 7.0, 7.0, 7.0, 7.0 163 , 0.0, 1.0, 0.0, 7.0, 7.0, 7.0, 7.0
166 , 0.0, 0.0, 1.0, 7.0, 7.0, 7.0, 7.0 ] 164 , 0.0, 0.0, 1.0, 7.0, 7.0, 7.0, 7.0 ]
167 165
168-} 166-}
167infixl 3 |||
168(|||) :: Matrix Double -> Matrix Double -> Matrix Double
169a ||| b = fromBlocks [[a,b]]
170
171-- | a synonym for ('|||') (unicode 0x00a6, broken bar)
169infixl 3 ¦ 172infixl 3 ¦
170(¦) :: Matrix Double -> Matrix Double -> Matrix Double 173(¦) :: Matrix Double -> Matrix Double -> Matrix Double
171a ¦ b = fromBlocks [[a,b]] 174(¦) = (|||)
175
172 176
173-- | vertical concatenation of real matrices 177-- | vertical concatenation of real matrices
174-- 178--
175-- (unicode 0x2014, em dash) 179(===) :: Matrix Double -> Matrix Double -> Matrix Double
180infixl 2 ===
181a === b = fromBlocks [[a],[b]]
182
183-- | a synonym for ('===') (unicode 0x2014, em dash)
176(——) :: Matrix Double -> Matrix Double -> Matrix Double 184(——) :: Matrix Double -> Matrix Double -> Matrix Double
177infixl 2 —— 185infixl 2 ——
178a —— b = fromBlocks [[a],[b]] 186(——) = (===)
187
179 188
180(#) :: Matrix Double -> Matrix Double -> Matrix Double 189(#) :: Matrix Double -> Matrix Double -> Matrix Double
181infixl 2 # 190infixl 2 #
@@ -356,7 +365,26 @@ pairwiseD2 x y | ok = x2 `outer` oy + ox `outer` y2 - 2* x <> trans y
356 365
357-------------------------------------------------------------------------------- 366--------------------------------------------------------------------------------
358 367
359-- | outer products of rows 368{- | outer products of rows
369
370>>> a
371(3><2)
372 [ 1.0, 2.0
373 , 10.0, 20.0
374 , 100.0, 200.0 ]
375>>> b
376(3><3)
377 [ 1.0, 2.0, 3.0
378 , 4.0, 5.0, 6.0
379 , 7.0, 8.0, 9.0 ]
380
381>>> rowOuters a (b ||| 1)
382(3><8)
383 [ 1.0, 2.0, 3.0, 1.0, 2.0, 4.0, 6.0, 2.0
384 , 40.0, 50.0, 60.0, 10.0, 80.0, 100.0, 120.0, 20.0
385 , 700.0, 800.0, 900.0, 100.0, 1400.0, 1600.0, 1800.0, 200.0 ]
386
387-}
360rowOuters :: Matrix Double -> Matrix Double -> Matrix Double 388rowOuters :: Matrix Double -> Matrix Double -> Matrix Double
361rowOuters a b = a' * b' 389rowOuters a b = a' * b'
362 where 390 where
diff --git a/packages/base/src/Numeric/LinearAlgebra/Util/Convolution.hs b/packages/base/src/Numeric/LinearAlgebra/Util/Convolution.hs
index c8c7536..c9e75de 100644
--- a/packages/base/src/Numeric/LinearAlgebra/Util/Convolution.hs
+++ b/packages/base/src/Numeric/LinearAlgebra/Util/Convolution.hs
@@ -16,6 +16,7 @@ module Numeric.LinearAlgebra.Util.Convolution(
16 corr2, conv2, separable 16 corr2, conv2, separable
17) where 17) where
18 18
19import qualified Data.Vector.Storable as SV
19import Data.Packed.Numeric 20import Data.Packed.Numeric
20 21
21 22
@@ -51,7 +52,7 @@ conv ker v
51 | dim ker == 0 = konst 0 (dim v) 52 | dim ker == 0 = konst 0 (dim v)
52 | otherwise = corr ker' v' 53 | otherwise = corr ker' v'
53 where 54 where
54 ker' = (flatten.fliprl.asRow) ker 55 ker' = SV.reverse ker
55 v' = vjoin [z,v,z] 56 v' = vjoin [z,v,z]
56 z = konst 0 (dim ker -1) 57 z = konst 0 (dim ker -1)
57 58