toon-members
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Toon-members] TooN LU.h


From: Tom Drummond
Subject: [Toon-members] TooN LU.h
Date: Sun, 09 Jul 2006 19:53:01 +0000

CVSROOT:        /sources/toon
Module name:    TooN
Changes by:     Tom Drummond <twd20>    06/07/09 19:53:01

Modified files:
        .              : LU.h 

Log message:
        added determinant()

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/TooN/LU.h?cvsroot=toon&r1=1.10&r2=1.11

Patches:
Index: LU.h
===================================================================
RCS file: /sources/toon/TooN/LU.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- LU.h        17 Jun 2006 14:31:19 -0000      1.10
+++ LU.h        9 Jul 2006 19:53:01 -0000       1.11
@@ -45,9 +45,10 @@
     int lda = Size;
     int M = Size;
     int N = Size;
-    dgetrf_(&M,&N,my_lu.get_data_ptr(),&lda,my_IPIV,&my_info);
-    if(my_info < 0){
-      std::cerr << "error in LU, INFO was " << my_info << std::endl;
+    int info;
+    dgetrf_(&M,&N,my_lu.get_data_ptr(),&lda,my_IPIV,&info);
+    if(info != 0){
+      std::cerr << "error in LU, INFO was " << info << std::endl;
     }
   }
 
@@ -145,10 +146,11 @@
     int lda=Size;
     int lwork=-1;
     double size;
-    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, &size, &lwork, 
&my_info);
+    int info;
+    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, &size, &lwork, &info);
     lwork=int(size);
     double* WORK = new double[lwork];
-    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, WORK, &lwork, &my_info);
+    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, WORK, &lwork, &info);
     delete [] WORK;
     return Inverse;
   }
@@ -156,10 +158,26 @@
   Matrix<Size,Size,RowMajor>& get_lu(){return my_lu;}
   const Matrix<Size,Size,RowMajor>& get_lu()const {return my_lu;}
 
-  int get_info() const { return my_info; }
+  inline int get_sign() const {
+    int result=1;
+    for(int i=0; i<Size-1; i++){
+      if(my_IPIV[i] > i+1){
+       result=-result;
+      }
+    }
+    return result;
+  }
+
+  inline double determinant() const {
+    double result = get_sign();
+    for (int i=0; i<Size; i++){
+      result*=my_lu(i,i);
+    }
+    return result;
+  }
+
  private:
   Matrix<Size,Size,RowMajor> my_lu;
-  int my_info;
   int my_IPIV[Size];
 };
   
@@ -190,9 +208,10 @@
     int lda = my_lu.num_cols();
     int M = lda;
     int N = lda;
-    dgetrf_(&M,&N,my_lu.get_data_ptr(),&lda,my_IPIV,&my_info);
-    if(my_info < 0){
-      std::cerr << "error in LU, INFO was " << my_info << std::endl;
+    int info;
+    dgetrf_(&M,&N,my_lu.get_data_ptr(),&lda,my_IPIV,&info);
+    if(info != 0){
+      std::cerr << "error in LU, INFO was " << info << std::endl;
     }
   }
 
@@ -293,10 +312,11 @@
     int lda=my_lu.num_rows();;
     int lwork=-1;
     double size;
-    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, &size, &lwork, 
&my_info);
+    int info;
+    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, &size, &lwork, &info);
     lwork=int(size);
     double* WORK = new double[lwork];
-    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, WORK, &lwork, &my_info);
+    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, WORK, &lwork, &info);
     delete [] WORK;
     return Inverse;
   }
@@ -304,12 +324,9 @@
   Matrix<-1,-1,RowMajor>& get_lu(){return my_lu;}
   const Matrix<-1,-1,RowMajor>& get_lu()const {return my_lu;}
 
-  int get_info() const { return my_info; }
-
 
  private:
   Matrix<-1,-1,RowMajor> my_lu;
-  int my_info;
   int* my_IPIV;
 };
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]