diff options
author | Vivian McPhail <haskell.vivian.mcphail@gmail.com> | 2010-07-08 23:03:48 +0000 |
---|---|---|
committer | Vivian McPhail <haskell.vivian.mcphail@gmail.com> | 2010-07-08 23:03:48 +0000 |
commit | 97e8a48be58fd53afccc7ae01ee6ec5805d5c1cd (patch) | |
tree | 837f4a6b21e0317da834c8ac42c8adfce9a22d24 /lib | |
parent | b8699c4f1acff1e3f31cdbac1a7a4a8864b1eeba (diff) |
Linear and Floating (Complex Float)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Data/Packed/Internal/Matrix.hs | 10 | ||||
-rw-r--r-- | lib/Data/Packed/Internal/Signatures.hs | 2 | ||||
-rw-r--r-- | lib/Data/Packed/Matrix.hs | 9 | ||||
-rw-r--r-- | lib/Numeric/GSL/Vector.hs | 24 | ||||
-rw-r--r-- | lib/Numeric/GSL/gsl-aux.c | 126 | ||||
-rw-r--r-- | lib/Numeric/LinearAlgebra/Instances.hs | 29 | ||||
-rw-r--r-- | lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c | 22 | ||||
-rw-r--r-- | lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.h | 6 | ||||
-rw-r--r-- | lib/Numeric/LinearAlgebra/Linear.hs | 11 |
9 files changed, 236 insertions, 3 deletions
diff --git a/lib/Data/Packed/Internal/Matrix.hs b/lib/Data/Packed/Internal/Matrix.hs index 7b3b305..861c72a 100644 --- a/lib/Data/Packed/Internal/Matrix.hs +++ b/lib/Data/Packed/Internal/Matrix.hs | |||
@@ -265,6 +265,10 @@ instance Element Double where | |||
265 | transdata = transdataAux ctransR | 265 | transdata = transdataAux ctransR |
266 | constantD = constantAux cconstantR | 266 | constantD = constantAux cconstantR |
267 | 267 | ||
268 | instance Element (Complex Float) where | ||
269 | transdata = transdataAux ctransQ | ||
270 | constantD = constantAux cconstantQ | ||
271 | |||
268 | instance Element (Complex Double) where | 272 | instance Element (Complex Double) where |
269 | transdata = transdataAux ctransC | 273 | transdata = transdataAux ctransC |
270 | constantD = constantAux cconstantC | 274 | constantD = constantAux cconstantC |
@@ -314,6 +318,7 @@ transdataAux fun c1 d c2 = | |||
314 | 318 | ||
315 | foreign import ccall "transF" ctransF :: TFMFM | 319 | foreign import ccall "transF" ctransF :: TFMFM |
316 | foreign import ccall "transR" ctransR :: TMM | 320 | foreign import ccall "transR" ctransR :: TMM |
321 | foreign import ccall "transQ" ctransQ :: TQMQM | ||
317 | foreign import ccall "transC" ctransC :: TCMCM | 322 | foreign import ccall "transC" ctransC :: TCMCM |
318 | ---------------------------------------------------------------------- | 323 | ---------------------------------------------------------------------- |
319 | 324 | ||
@@ -342,9 +347,14 @@ constantR :: Double -> Int -> Vector Double | |||
342 | constantR = constantAux cconstantR | 347 | constantR = constantAux cconstantR |
343 | foreign import ccall "constantR" cconstantR :: Ptr Double -> TV | 348 | foreign import ccall "constantR" cconstantR :: Ptr Double -> TV |
344 | 349 | ||
350 | constantQ :: Complex Float -> Int -> Vector (Complex Float) | ||
351 | constantQ = constantAux cconstantQ | ||
352 | foreign import ccall "constantQ" cconstantQ :: Ptr (Complex Float) -> TQV | ||
353 | |||
345 | constantC :: Complex Double -> Int -> Vector (Complex Double) | 354 | constantC :: Complex Double -> Int -> Vector (Complex Double) |
346 | constantC = constantAux cconstantC | 355 | constantC = constantAux cconstantC |
347 | foreign import ccall "constantC" cconstantC :: Ptr (Complex Double) -> TCV | 356 | foreign import ccall "constantC" cconstantC :: Ptr (Complex Double) -> TCV |
357 | |||
348 | ---------------------------------------------------------------------- | 358 | ---------------------------------------------------------------------- |
349 | 359 | ||
350 | -- | Extracts a submatrix from a matrix. | 360 | -- | Extracts a submatrix from a matrix. |
diff --git a/lib/Data/Packed/Internal/Signatures.hs b/lib/Data/Packed/Internal/Signatures.hs index 78d00fa..8c1c5f6 100644 --- a/lib/Data/Packed/Internal/Signatures.hs +++ b/lib/Data/Packed/Internal/Signatures.hs | |||
@@ -59,6 +59,8 @@ type TQV = CInt -> PQ -> IO CInt -- | |||
59 | type TQVQV = CInt -> PQ -> TQV -- | 59 | type TQVQV = CInt -> PQ -> TQV -- |
60 | type TQVQVQV = CInt -> PQ -> TQVQV -- | 60 | type TQVQVQV = CInt -> PQ -> TQVQV -- |
61 | type TQVF = CInt -> PQ -> TF -- | 61 | type TQVF = CInt -> PQ -> TF -- |
62 | type TQM = CInt -> CInt -> PQ -> IO CInt -- | ||
63 | type TQMQM = CInt -> CInt -> PQ -> TQM -- | ||
62 | type TCMCV = CInt -> CInt -> PC -> TCV -- | 64 | type TCMCV = CInt -> CInt -> PC -> TCV -- |
63 | type TVCV = CInt -> PD -> TCV -- | 65 | type TVCV = CInt -> PD -> TCV -- |
64 | type TCVM = CInt -> PC -> TM -- | 66 | type TCVM = CInt -> PC -> TM -- |
diff --git a/lib/Data/Packed/Matrix.hs b/lib/Data/Packed/Matrix.hs index c6d8a90..e7ee781 100644 --- a/lib/Data/Packed/Matrix.hs +++ b/lib/Data/Packed/Matrix.hs | |||
@@ -452,6 +452,7 @@ class (Element e) => Container c e where | |||
452 | fromComplex :: RealFloat e => c (Complex e) -> (c e, c e) | 452 | fromComplex :: RealFloat e => c (Complex e) -> (c e, c e) |
453 | comp :: RealFloat e => c e -> c (Complex e) | 453 | comp :: RealFloat e => c e -> c (Complex e) |
454 | conj :: RealFloat e => c (Complex e) -> c (Complex e) | 454 | conj :: RealFloat e => c (Complex e) -> c (Complex e) |
455 | -- these next two are now weird given we have Floats as well | ||
455 | real :: c Double -> c e | 456 | real :: c Double -> c e |
456 | complex :: c e -> c (Complex Double) | 457 | complex :: c e -> c (Complex Double) |
457 | 458 | ||
@@ -471,6 +472,14 @@ instance Container Vector Double where | |||
471 | real = id | 472 | real = id |
472 | complex = comp | 473 | complex = comp |
473 | 474 | ||
475 | instance Container Vector (Complex Float) where | ||
476 | toComplex = undefined -- can't match | ||
477 | fromComplex = undefined | ||
478 | comp = undefined | ||
479 | conj = undefined | ||
480 | real = comp . mapVector realToFrac | ||
481 | complex = mapVector (\(r :+ i) -> realToFrac r :+ realToFrac i) | ||
482 | |||
474 | instance Container Vector (Complex Double) where | 483 | instance Container Vector (Complex Double) where |
475 | toComplex = undefined -- can't match | 484 | toComplex = undefined -- can't match |
476 | fromComplex = undefined | 485 | fromComplex = undefined |
diff --git a/lib/Numeric/GSL/Vector.hs b/lib/Numeric/GSL/Vector.hs index 0148c4f..14ba0ff 100644 --- a/lib/Numeric/GSL/Vector.hs +++ b/lib/Numeric/GSL/Vector.hs | |||
@@ -17,9 +17,9 @@ module Numeric.GSL.Vector ( | |||
17 | sumF, sumR, sumQ, sumC, | 17 | sumF, sumR, sumQ, sumC, |
18 | dotF, dotR, dotQ, dotC, | 18 | dotF, dotR, dotQ, dotC, |
19 | FunCodeS(..), toScalarR, toScalarF, toScalarC, toScalarQ, | 19 | FunCodeS(..), toScalarR, toScalarF, toScalarC, toScalarQ, |
20 | FunCodeV(..), vectorMapR, vectorMapC, vectorMapF, | 20 | FunCodeV(..), vectorMapR, vectorMapC, vectorMapF, vectorMapQ, |
21 | FunCodeSV(..), vectorMapValR, vectorMapValC, vectorMapValF, | 21 | FunCodeSV(..), vectorMapValR, vectorMapValC, vectorMapValF, vectorMapValQ, |
22 | FunCodeVV(..), vectorZipR, vectorZipC, vectorZipF, | 22 | FunCodeVV(..), vectorZipR, vectorZipC, vectorZipF, vectorZipQ, |
23 | RandDist(..), randomVector | 23 | RandDist(..), randomVector |
24 | ) where | 24 | ) where |
25 | 25 | ||
@@ -214,6 +214,12 @@ vectorMapF = vectorMapAux c_vectorMapF | |||
214 | 214 | ||
215 | foreign import ccall safe "gsl-aux.h mapF" c_vectorMapF :: CInt -> TFF | 215 | foreign import ccall safe "gsl-aux.h mapF" c_vectorMapF :: CInt -> TFF |
216 | 216 | ||
217 | -- | map of real vectors with given function | ||
218 | vectorMapQ :: FunCodeV -> Vector (Complex Float) -> Vector (Complex Float) | ||
219 | vectorMapQ = vectorMapAux c_vectorMapQ | ||
220 | |||
221 | foreign import ccall safe "gsl-aux.h mapQ" c_vectorMapQ :: CInt -> TQVQV | ||
222 | |||
217 | ------------------------------------------------------------------- | 223 | ------------------------------------------------------------------- |
218 | 224 | ||
219 | -- | map of real vectors with given function | 225 | -- | map of real vectors with given function |
@@ -234,6 +240,12 @@ vectorMapValF oper = vectorMapValAux c_vectorMapValF (fromei oper) | |||
234 | 240 | ||
235 | foreign import ccall safe "gsl-aux.h mapValF" c_vectorMapValF :: CInt -> Ptr Float -> TFF | 241 | foreign import ccall safe "gsl-aux.h mapValF" c_vectorMapValF :: CInt -> Ptr Float -> TFF |
236 | 242 | ||
243 | -- | map of complex vectors with given function | ||
244 | vectorMapValQ :: FunCodeSV -> Complex Float -> Vector (Complex Float) -> Vector (Complex Float) | ||
245 | vectorMapValQ oper = vectorMapValAux c_vectorMapValQ (fromei oper) | ||
246 | |||
247 | foreign import ccall safe "gsl-aux.h mapValQ" c_vectorMapValQ :: CInt -> Ptr (Complex Float) -> TQVQV | ||
248 | |||
237 | ------------------------------------------------------------------- | 249 | ------------------------------------------------------------------- |
238 | 250 | ||
239 | -- | elementwise operation on real vectors | 251 | -- | elementwise operation on real vectors |
@@ -254,6 +266,12 @@ vectorZipF = vectorZipAux c_vectorZipF | |||
254 | 266 | ||
255 | foreign import ccall safe "gsl-aux.h zipF" c_vectorZipF :: CInt -> TFFF | 267 | foreign import ccall safe "gsl-aux.h zipF" c_vectorZipF :: CInt -> TFFF |
256 | 268 | ||
269 | -- | elementwise operation on complex vectors | ||
270 | vectorZipQ :: FunCodeVV -> Vector (Complex Float) -> Vector (Complex Float) -> Vector (Complex Float) | ||
271 | vectorZipQ = vectorZipAux c_vectorZipQ | ||
272 | |||
273 | foreign import ccall safe "gsl-aux.h zipQ" c_vectorZipQ :: CInt -> TQVQVQV | ||
274 | |||
257 | ----------------------------------------------------------------------- | 275 | ----------------------------------------------------------------------- |
258 | 276 | ||
259 | data RandDist = Uniform -- ^ uniform distribution in [0,1) | 277 | data RandDist = Uniform -- ^ uniform distribution in [0,1) |
diff --git a/lib/Numeric/GSL/gsl-aux.c b/lib/Numeric/GSL/gsl-aux.c index 3f9eeba..689989d 100644 --- a/lib/Numeric/GSL/gsl-aux.c +++ b/lib/Numeric/GSL/gsl-aux.c | |||
@@ -393,6 +393,83 @@ int mapC(int code, KCVEC(x), CVEC(r)) { | |||
393 | } | 393 | } |
394 | 394 | ||
395 | 395 | ||
396 | gsl_complex_float complex_float_math_fun(gsl_complex (*cf)(gsl_complex), gsl_complex_float a) | ||
397 | { | ||
398 | gsl_complex c; | ||
399 | gsl_complex r; | ||
400 | |||
401 | gsl_complex_float float_r; | ||
402 | |||
403 | c.dat[0] = a.dat[0]; | ||
404 | c.dat[1] = a.dat[1]; | ||
405 | |||
406 | r = (*cf)(c); | ||
407 | |||
408 | float_r.dat[0] = r.dat[0]; | ||
409 | float_r.dat[1] = r.dat[1]; | ||
410 | |||
411 | return float_r; | ||
412 | } | ||
413 | |||
414 | gsl_complex_float complex_float_math_op(gsl_complex (*cf)(gsl_complex,gsl_complex), | ||
415 | gsl_complex_float a,gsl_complex_float b) | ||
416 | { | ||
417 | gsl_complex c1; | ||
418 | gsl_complex c2; | ||
419 | gsl_complex r; | ||
420 | |||
421 | gsl_complex_float float_r; | ||
422 | |||
423 | c1.dat[0] = a.dat[0]; | ||
424 | c1.dat[1] = a.dat[1]; | ||
425 | |||
426 | c2.dat[0] = b.dat[0]; | ||
427 | c2.dat[1] = b.dat[1]; | ||
428 | |||
429 | r = (*cf)(c1,c2); | ||
430 | |||
431 | float_r.dat[0] = r.dat[0]; | ||
432 | float_r.dat[1] = r.dat[1]; | ||
433 | |||
434 | return float_r; | ||
435 | } | ||
436 | |||
437 | #define OPC(C,F) case C: { for(k=0;k<xn;k++) rp[k] = complex_float_math_fun(&F,xp[k]); OK } | ||
438 | #define OPCA(C,F,A,B) case C: { for(k=0;k<xn;k++) rp[k] = complex_float_math_op(&F,A,B); OK } | ||
439 | int mapQAux(int code, KGQVEC(x), GQVEC(r)) { | ||
440 | int k; | ||
441 | REQUIRES(xn == rn,BAD_SIZE); | ||
442 | DEBUGMSG("mapQ"); | ||
443 | switch (code) { | ||
444 | OPC(0,gsl_complex_sin) | ||
445 | OPC(1,gsl_complex_cos) | ||
446 | OPC(2,gsl_complex_tan) | ||
447 | OPC(3,complex_abs) | ||
448 | OPC(4,gsl_complex_arcsin) | ||
449 | OPC(5,gsl_complex_arccos) | ||
450 | OPC(6,gsl_complex_arctan) | ||
451 | OPC(7,gsl_complex_sinh) | ||
452 | OPC(8,gsl_complex_cosh) | ||
453 | OPC(9,gsl_complex_tanh) | ||
454 | OPC(10,gsl_complex_arcsinh) | ||
455 | OPC(11,gsl_complex_arccosh) | ||
456 | OPC(12,gsl_complex_arctanh) | ||
457 | OPC(13,gsl_complex_exp) | ||
458 | OPC(14,gsl_complex_log) | ||
459 | OPC(15,complex_signum) | ||
460 | OPC(16,gsl_complex_sqrt) | ||
461 | |||
462 | // gsl_complex_arg | ||
463 | // gsl_complex_abs | ||
464 | default: ERROR(BAD_CODE); | ||
465 | } | ||
466 | } | ||
467 | |||
468 | int mapQ(int code, KQVEC(x), QVEC(r)) { | ||
469 | return mapQAux(code, xn, (gsl_complex_float*)xp, rn, (gsl_complex_float*)rp); | ||
470 | } | ||
471 | |||
472 | |||
396 | int mapValR(int code, double* pval, KRVEC(x), RVEC(r)) { | 473 | int mapValR(int code, double* pval, KRVEC(x), RVEC(r)) { |
397 | int k; | 474 | int k; |
398 | double val = *pval; | 475 | double val = *pval; |
@@ -446,6 +523,27 @@ int mapValC(int code, gsl_complex* val, KCVEC(x), CVEC(r)) { | |||
446 | } | 523 | } |
447 | 524 | ||
448 | 525 | ||
526 | int mapValQAux(int code, gsl_complex_float* pval, KQVEC(x), GQVEC(r)) { | ||
527 | int k; | ||
528 | gsl_complex_float val = *pval; | ||
529 | REQUIRES(xn == rn,BAD_SIZE); | ||
530 | DEBUGMSG("mapValQ"); | ||
531 | switch (code) { | ||
532 | OPCA(0,gsl_complex_mul,val,xp[k]) | ||
533 | OPCA(1,gsl_complex_div,val,xp[k]) | ||
534 | OPCA(2,gsl_complex_add,val,xp[k]) | ||
535 | OPCA(3,gsl_complex_sub,val,xp[k]) | ||
536 | OPCA(4,gsl_complex_pow,val,xp[k]) | ||
537 | OPCA(5,gsl_complex_pow,xp[k],val) | ||
538 | default: ERROR(BAD_CODE); | ||
539 | } | ||
540 | } | ||
541 | |||
542 | int mapValQ(int code, gsl_complex_float* val, KQVEC(x), QVEC(r)) { | ||
543 | return mapValQAux(code, val, xn, (gsl_complex_float*)xp, rn, (gsl_complex_float*)rp); | ||
544 | } | ||
545 | |||
546 | |||
449 | #define OPZE(C,msg,E) case C: {DEBUGMSG(msg) for(k=0;k<an;k++) rp[k] = E(ap[k],bp[k]); OK } | 547 | #define OPZE(C,msg,E) case C: {DEBUGMSG(msg) for(k=0;k<an;k++) rp[k] = E(ap[k],bp[k]); OK } |
450 | #define OPZV(C,msg,E) case C: {DEBUGMSG(msg) res = E(V(r),V(b)); CHECK(res,res); OK } | 548 | #define OPZV(C,msg,E) case C: {DEBUGMSG(msg) res = E(V(r),V(b)); CHECK(res,res); OK } |
451 | int zipR(int code, KRVEC(a), KRVEC(b), RVEC(r)) { | 549 | int zipR(int code, KRVEC(a), KRVEC(b), RVEC(r)) { |
@@ -519,6 +617,34 @@ int zipC(int code, KCVEC(a), KCVEC(b), CVEC(r)) { | |||
519 | } | 617 | } |
520 | 618 | ||
521 | 619 | ||
620 | #define OPCZE(C,msg,E) case C: {DEBUGMSG(msg) for(k=0;k<an;k++) rp[k] = complex_float_math_op(&E,ap[k],bp[k]); OK } | ||
621 | int zipQAux(int code, KGQVEC(a), KGQVEC(b), GQVEC(r)) { | ||
622 | REQUIRES(an == bn && an == rn, BAD_SIZE); | ||
623 | int k; | ||
624 | switch(code) { | ||
625 | OPCZE(0,"zipQ Add",gsl_complex_add) | ||
626 | OPCZE(1,"zipQ Sub",gsl_complex_sub) | ||
627 | OPCZE(2,"zipQ Mul",gsl_complex_mul) | ||
628 | OPCZE(3,"zipQ Div",gsl_complex_div) | ||
629 | OPCZE(4,"zipQ Pow",gsl_complex_pow) | ||
630 | //OPZE(5,"zipR ATan2",atan2) | ||
631 | } | ||
632 | //KCVVIEW(a); | ||
633 | //KCVVIEW(b); | ||
634 | //CVVIEW(r); | ||
635 | //gsl_vector_memcpy(V(r),V(a)); | ||
636 | //int res; | ||
637 | switch(code) { | ||
638 | default: ERROR(BAD_CODE); | ||
639 | } | ||
640 | } | ||
641 | |||
642 | |||
643 | int zipQ(int code, KQVEC(a), KQVEC(b), QVEC(r)) { | ||
644 | return zipQAux(code, an, (gsl_complex_float*)ap, bn, (gsl_complex_float*)bp, rn, (gsl_complex_float*)rp); | ||
645 | } | ||
646 | |||
647 | |||
522 | 648 | ||
523 | int fft(int code, KCVEC(X), CVEC(R)) { | 649 | int fft(int code, KCVEC(X), CVEC(R)) { |
524 | REQUIRES(Xn == Rn,BAD_SIZE); | 650 | REQUIRES(Xn == Rn,BAD_SIZE); |
diff --git a/lib/Numeric/LinearAlgebra/Instances.hs b/lib/Numeric/LinearAlgebra/Instances.hs index bba89c8..04a9d88 100644 --- a/lib/Numeric/LinearAlgebra/Instances.hs +++ b/lib/Numeric/LinearAlgebra/Instances.hs | |||
@@ -118,6 +118,14 @@ instance Num (Vector (Complex Double)) where | |||
118 | abs = vectorMapC Abs | 118 | abs = vectorMapC Abs |
119 | fromInteger = fromList . return . fromInteger | 119 | fromInteger = fromList . return . fromInteger |
120 | 120 | ||
121 | instance Num (Vector (Complex Float)) where | ||
122 | (+) = adaptScalar addConstant add (flip addConstant) | ||
123 | negate = scale (-1) | ||
124 | (*) = adaptScalar scale mul (flip scale) | ||
125 | signum = vectorMapQ Sign | ||
126 | abs = vectorMapQ Abs | ||
127 | fromInteger = fromList . return . fromInteger | ||
128 | |||
121 | instance Linear Matrix a => Eq (Matrix a) where | 129 | instance Linear Matrix a => Eq (Matrix a) where |
122 | (==) = equal | 130 | (==) = equal |
123 | 131 | ||
@@ -209,6 +217,27 @@ instance Floating (Vector (Complex Double)) where | |||
209 | 217 | ||
210 | ----------------------------------------------------------- | 218 | ----------------------------------------------------------- |
211 | 219 | ||
220 | instance Floating (Vector (Complex Float)) where | ||
221 | sin = vectorMapQ Sin | ||
222 | cos = vectorMapQ Cos | ||
223 | tan = vectorMapQ Tan | ||
224 | asin = vectorMapQ ASin | ||
225 | acos = vectorMapQ ACos | ||
226 | atan = vectorMapQ ATan | ||
227 | sinh = vectorMapQ Sinh | ||
228 | cosh = vectorMapQ Cosh | ||
229 | tanh = vectorMapQ Tanh | ||
230 | asinh = vectorMapQ ASinh | ||
231 | acosh = vectorMapQ ACosh | ||
232 | atanh = vectorMapQ ATanh | ||
233 | exp = vectorMapQ Exp | ||
234 | log = vectorMapQ Log | ||
235 | sqrt = vectorMapQ Sqrt | ||
236 | (**) = adaptScalar (vectorMapValQ PowSV) (vectorZipQ Pow) (flip (vectorMapValQ PowVS)) | ||
237 | pi = fromList [pi] | ||
238 | |||
239 | ----------------------------------------------------------- | ||
240 | |||
212 | instance (Linear Vector a, Floating (Vector a), Fractional (Matrix a)) => Floating (Matrix a) where | 241 | instance (Linear Vector a, Floating (Vector a), Fractional (Matrix a)) => Floating (Matrix a) where |
213 | sin = liftMatrix sin | 242 | sin = liftMatrix sin |
214 | cos = liftMatrix cos | 243 | cos = liftMatrix cos |
diff --git a/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c b/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c index b9c2572..7a40991 100644 --- a/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c +++ b/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c | |||
@@ -1063,6 +1063,18 @@ int transR(KDMAT(x),DMAT(t)) { | |||
1063 | OK | 1063 | OK |
1064 | } | 1064 | } |
1065 | 1065 | ||
1066 | int transQ(KQMAT(x),QMAT(t)) { | ||
1067 | REQUIRES(xr==tc && xc==tr,BAD_SIZE); | ||
1068 | DEBUGMSG("transQ"); | ||
1069 | int i,j; | ||
1070 | for (i=0; i<tr; i++) { | ||
1071 | for (j=0; j<tc; j++) { | ||
1072 | ((complex*)tp)[i*tc+j] = ((complex*)xp)[j*xc+i]; | ||
1073 | } | ||
1074 | } | ||
1075 | OK | ||
1076 | } | ||
1077 | |||
1066 | int transC(KCMAT(x),CMAT(t)) { | 1078 | int transC(KCMAT(x),CMAT(t)) { |
1067 | REQUIRES(xr==tc && xc==tr,BAD_SIZE); | 1079 | REQUIRES(xr==tc && xc==tr,BAD_SIZE); |
1068 | DEBUGMSG("transC"); | 1080 | DEBUGMSG("transC"); |
@@ -1097,6 +1109,16 @@ int constantR(double * pval, DVEC(r)) { | |||
1097 | OK | 1109 | OK |
1098 | } | 1110 | } |
1099 | 1111 | ||
1112 | int constantQ(complex* pval, QVEC(r)) { | ||
1113 | DEBUGMSG("constantQ") | ||
1114 | int k; | ||
1115 | complex val = *pval; | ||
1116 | for(k=0;k<rn;k++) { | ||
1117 | ((complex*)rp)[k]=val; | ||
1118 | } | ||
1119 | OK | ||
1120 | } | ||
1121 | |||
1100 | int constantC(doublecomplex* pval, CVEC(r)) { | 1122 | int constantC(doublecomplex* pval, CVEC(r)) { |
1101 | DEBUGMSG("constantC") | 1123 | DEBUGMSG("constantC") |
1102 | int k; | 1124 | int k; |
diff --git a/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.h b/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.h index 415a6ab..d01d9e5 100644 --- a/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.h +++ b/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.h | |||
@@ -42,16 +42,20 @@ typedef short ftnlen; | |||
42 | 42 | ||
43 | #define FVEC(A) int A##n, float*A##p | 43 | #define FVEC(A) int A##n, float*A##p |
44 | #define DVEC(A) int A##n, double*A##p | 44 | #define DVEC(A) int A##n, double*A##p |
45 | #define QVEC(A) int A##n, float*A##p | ||
45 | #define CVEC(A) int A##n, double*A##p | 46 | #define CVEC(A) int A##n, double*A##p |
46 | #define FMAT(A) int A##r, int A##c, float* A##p | 47 | #define FMAT(A) int A##r, int A##c, float* A##p |
47 | #define DMAT(A) int A##r, int A##c, double* A##p | 48 | #define DMAT(A) int A##r, int A##c, double* A##p |
49 | #define QMAT(A) int A##r, int A##c, float* A##p | ||
48 | #define CMAT(A) int A##r, int A##c, double* A##p | 50 | #define CMAT(A) int A##r, int A##c, double* A##p |
49 | 51 | ||
50 | #define KFVEC(A) int A##n, const float*A##p | 52 | #define KFVEC(A) int A##n, const float*A##p |
51 | #define KDVEC(A) int A##n, const double*A##p | 53 | #define KDVEC(A) int A##n, const double*A##p |
54 | #define KQVEC(A) int A##n, const float*A##p | ||
52 | #define KCVEC(A) int A##n, const double*A##p | 55 | #define KCVEC(A) int A##n, const double*A##p |
53 | #define KFMAT(A) int A##r, int A##c, const float* A##p | 56 | #define KFMAT(A) int A##r, int A##c, const float* A##p |
54 | #define KDMAT(A) int A##r, int A##c, const double* A##p | 57 | #define KDMAT(A) int A##r, int A##c, const double* A##p |
58 | #define KQMAT(A) int A##r, int A##c, const float* A##p | ||
55 | #define KCMAT(A) int A##r, int A##c, const double* A##p | 59 | #define KCMAT(A) int A##r, int A##c, const double* A##p |
56 | 60 | ||
57 | /********************************************************/ | 61 | /********************************************************/ |
@@ -61,10 +65,12 @@ int multiplyC(int ta, int tb, KCMAT(a),KCMAT(b),CMAT(r)); | |||
61 | 65 | ||
62 | int transF(KFMAT(x),FMAT(t)); | 66 | int transF(KFMAT(x),FMAT(t)); |
63 | int transR(KDMAT(x),DMAT(t)); | 67 | int transR(KDMAT(x),DMAT(t)); |
68 | int transQ(KQMAT(x),QMAT(t)); | ||
64 | int transC(KCMAT(x),CMAT(t)); | 69 | int transC(KCMAT(x),CMAT(t)); |
65 | 70 | ||
66 | int constantF(float * pval, FVEC(r)); | 71 | int constantF(float * pval, FVEC(r)); |
67 | int constantR(double * pval, DVEC(r)); | 72 | int constantR(double * pval, DVEC(r)); |
73 | int constantQ(complex* pval, QVEC(r)); | ||
68 | int constantC(doublecomplex* pval, CVEC(r)); | 74 | int constantC(doublecomplex* pval, CVEC(r)); |
69 | 75 | ||
70 | int svd_l_R(KDMAT(x),DMAT(u),DVEC(s),DMAT(v)); | 76 | int svd_l_R(KDMAT(x),DMAT(u),DVEC(s),DMAT(v)); |
diff --git a/lib/Numeric/LinearAlgebra/Linear.hs b/lib/Numeric/LinearAlgebra/Linear.hs index aed6a2b..2351ff1 100644 --- a/lib/Numeric/LinearAlgebra/Linear.hs +++ b/lib/Numeric/LinearAlgebra/Linear.hs | |||
@@ -132,6 +132,17 @@ instance Linear Vector (Complex Double) where | |||
132 | equal u v = dim u == dim v && vectorMax (mapVector magnitude (sub u v)) == 0.0 | 132 | equal u v = dim u == dim v && vectorMax (mapVector magnitude (sub u v)) == 0.0 |
133 | scalar x = fromList [x] | 133 | scalar x = fromList [x] |
134 | 134 | ||
135 | instance Linear Vector (Complex Float) where | ||
136 | scale = vectorMapValQ Scale | ||
137 | scaleRecip = vectorMapValQ Recip | ||
138 | addConstant = vectorMapValQ AddConstant | ||
139 | add = vectorZipQ Add | ||
140 | sub = vectorZipQ Sub | ||
141 | mul = vectorZipQ Mul | ||
142 | divide = vectorZipQ Div | ||
143 | equal u v = dim u == dim v && vectorMax (mapVector magnitude (sub u v)) == 0.0 | ||
144 | scalar x = fromList [x] | ||
145 | |||
135 | instance (Linear Vector a, Container Matrix a) => (Linear Matrix a) where | 146 | instance (Linear Vector a, Container Matrix a) => (Linear Matrix a) where |
136 | scale x = liftMatrix (scale x) | 147 | scale x = liftMatrix (scale x) |
137 | scaleRecip x = liftMatrix (scaleRecip x) | 148 | scaleRecip x = liftMatrix (scaleRecip x) |