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: Mon, 10 Jul 2006 10:48:54 +0000

CVSROOT:        /cvsroot/toon
Module name:    TooN
Changes by:     Tom Drummond <twd20>    06/07/10 10:48:54

Modified files:
        .              : LU.h 

Log message:
        merged edits

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

Patches:
Index: LU.h
===================================================================
RCS file: /cvsroot/toon/TooN/LU.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- LU.h        9 Jul 2006 19:53:01 -0000       1.11
+++ LU.h        10 Jul 2006 10:48:54 -0000      1.12
@@ -1,4 +1,3 @@
-
 /*                       
         Copyright (C) 2005 Tom Drummond
 
@@ -45,10 +44,9 @@
     int lda = Size;
     int M = Size;
     int N = Size;
-    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;
+    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;
     }
   }
 
@@ -146,11 +144,10 @@
     int lda=Size;
     int lwork=-1;
     double size;
-    int info;
-    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, &size, &lwork, &info);
+    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, &size, &lwork, 
&my_info);
     lwork=int(size);
     double* WORK = new double[lwork];
-    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, WORK, &lwork, &info);
+    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, WORK, &lwork, &my_info);
     delete [] WORK;
     return Inverse;
   }
@@ -176,8 +173,10 @@
     return result;
   }
 
+  int get_info() const { return my_info; }
  private:
   Matrix<Size,Size,RowMajor> my_lu;
+  int my_info;
   int my_IPIV[Size];
 };
   
@@ -208,10 +207,9 @@
     int lda = my_lu.num_cols();
     int M = lda;
     int N = lda;
-    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;
+    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;
     }
   }
 
@@ -309,14 +307,13 @@
   Matrix<-1,-1,RowMajor> get_inverse(){
     Matrix<-1,-1,RowMajor> Inverse(my_lu);
     int N = my_lu.num_rows();
-    int lda=my_lu.num_rows();;
+    int lda=my_lu.num_rows();
     int lwork=-1;
     double size;
-    int info;
-    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, &size, &lwork, &info);
+    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, &size, &lwork, 
&my_info);
     lwork=int(size);
     double* WORK = new double[lwork];
-    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, WORK, &lwork, &info);
+    dgetri_(&N, Inverse.get_data_ptr(), &lda, my_IPIV, WORK, &lwork, &my_info);
     delete [] WORK;
     return Inverse;
   }
@@ -324,9 +321,30 @@
   Matrix<-1,-1,RowMajor>& get_lu(){return my_lu;}
   const Matrix<-1,-1,RowMajor>& get_lu()const {return my_lu;}
 
+  inline int get_sign() const {
+    int result=1;
+    for(int i=0; i<my_lu.num_rows()-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<my_lu.num_rows(); i++){
+      result*=my_lu(i,i);
+    }
+    return result;
+  }
+
+  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]