⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lu_solve.cc

📁 很好用的库
💻 CC
字号:
/* thanks to Valient Gough for this example program! */#include <mtl/matrix.h>#include <mtl/mtl.h>#include <mtl/utils.h>#include <mtl/lu.h>using namespace mtl;// don't print out the matrices once they get to this size...#define MAX_PRINT_SIZE 5typedef matrix<double, rectangle<>, dense<>, row_major>::type Matrix;typedef dense1D<double> Vector;double testMatrixError(const Matrix &A, const Matrix &AInv){  int size = A.nrows();  // test it  Matrix AInvA(size,size);  // AInvA = AInv * A  mult(AInv, A, AInvA);  // I = identity  typedef matrix<double, diagonal<>, packed<>, row_major>::type IdentMat;  IdentMat I(size, size, 0, 0);  mtl::set_value(I, 1.0);  // AInvA += -I  add(scaled(I, -1.0), AInvA);  if (size < MAX_PRINT_SIZE) {    std::cout << "Ainv * A - I = " << std::endl;    print_all_matrix(AInvA);  }  // find max error  double max_error = 0.0;  for(Matrix::iterator i = AInvA.begin(); i != AInvA.end(); ++i)    for(Matrix::Row::iterator j = (*i).begin(); j != (*i).end(); ++j)      if(fabs(*j) > fabs(max_error))	max_error = *j;          std::cout << "max error = " << max_error << std::endl;  return max_error;}void testLUSoln(const Matrix &A, const Vector &b, Vector &x){  // create LU decomposition  Matrix LU(A.nrows(), A.ncols());  dense1D<int> pvector(A.nrows());  copy(A, LU);  lu_factorize(LU, pvector);          // solve  lu_solve(LU, pvector, b, x);}void testLUInv(const Matrix &A, int size){  // invert it  Matrix AInv(size,size);          // create LU decomposition  Matrix LU(A.nrows(), A.ncols());  dense1D<int> pvector(A.nrows());  copy(A, LU);  lu_factor(LU, pvector);          // solve  lu_inverse(LU, pvector, AInv);          if(size < MAX_PRINT_SIZE) {    std::cout << "Ainv = " << std::endl;    print_all_matrix(AInv);  }  // test it  testMatrixError(A, AInv);}int main(int argc, char **argv){  typedef Matrix::size_type sizeT;  sizeT size = 3;  if(argc > 1)    size = atoi(argv[1]);  std::cout << "inverting matrix of size " << size << std::endl;  // create a random matrix and invert it.  Then see how close it comes to  // identity.  Matrix A(size,size);  Vector b(size);  Vector x(size);  // initialize  for (sizeT i=0; i<A.nrows(); i++) {    for (sizeT j=0; j<A.nrows(); j++)      A(i,j) = (double)(rand() % 200 - 100) / 50.0;    b[i] = (double)(rand() % 200 - 100) / 50.0;  }  if (size < MAX_PRINT_SIZE) {    std::cout << "A = " << std::endl;    print_all_matrix(A);  }          // time LU inv  std::cout << std::endl        << " ----------- testing inversion using LU decomposition"        << std::endl;  testLUInv(A, size);  if (size < MAX_PRINT_SIZE) {    std::cout << "solution = ";    print_vector(x);  }          // test LU solution  mtl::set_value(x, 0.0);  testLUSoln(A, b, x);  if(size < MAX_PRINT_SIZE) {    std::cout << "solution = ";    print_vector(x);  }  if(argc == 1)    std::cout << std::endl 	 << "pass size argument to program to time larger matrices." 	 << std::endl;  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -