[Top][All Lists]
[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;
};