mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
	
	
		
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2008 Gunter Winkler <guwi17@gmx.de>
							 | 
						||
| 
								 | 
							
								// Distributed under the Boost Software License, Version 1.0. (See
							 | 
						||
| 
								 | 
							
								// accompanying file LICENSE_1_0.txt or copy at
							 | 
						||
| 
								 | 
							
								// http://www.boost.org/LICENSE_1_0.txt)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// switch automatic singular check off
							 | 
						||
| 
								 | 
							
								#define BOOST_UBLAS_TYPE_CHECK 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/numeric/ublas/io.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/numeric/ublas/lu.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/cstdlib.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "common/testhelper.hpp"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <iostream>
							 | 
						||
| 
								 | 
							
								#include <sstream>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using namespace boost::numeric::ublas;
							 | 
						||
| 
								 | 
							
								using std::string;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static const string matrix_IN = "[3,3]((1,2,2),(2,3,3),(3,4,6))\0";
							 | 
						||
| 
								 | 
							
								static const string matrix_LU = "[3,3]((3,4,6),(3.33333343e-01,6.66666627e-01,0),(6.66666687e-01,4.99999911e-01,-1))\0";
							 | 
						||
| 
								 | 
							
								static const string matrix_INV= "[3,3]((-3,2,-7.94728621e-08),(1.50000012,0,-5.00000060e-01),(4.99999911e-01,-1,5.00000060e-01))\0";
							 | 
						||
| 
								 | 
							
								static const string matrix_PM = "[3](2,2,2)";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main () {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  typedef float TYPE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  typedef matrix<TYPE> MATRIX;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  MATRIX A;
							 | 
						||
| 
								 | 
							
								  MATRIX LU;
							 | 
						||
| 
								 | 
							
								  MATRIX INV;
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    std::istringstream is(matrix_IN);
							 | 
						||
| 
								 | 
							
								    is >> A;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    std::istringstream is(matrix_LU);
							 | 
						||
| 
								 | 
							
								    is >> LU;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    std::istringstream is(matrix_INV);
							 | 
						||
| 
								 | 
							
								    is >> INV;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  permutation_matrix<>::vector_type temp;
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    std::istringstream is(matrix_PM);
							 | 
						||
| 
								 | 
							
								    is >> temp;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  permutation_matrix<> PM(temp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  permutation_matrix<> pm(3);
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								  int result = lu_factorize<MATRIX, permutation_matrix<> >(A, pm);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  assertTrue("factorization completed: ", 0 == result);
							 | 
						||
| 
								 | 
							
								  assertTrue("LU factors are correct: ", compare(A, LU));
							 | 
						||
| 
								 | 
							
								  assertTrue("permutation is correct: ", compare(pm, PM));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  MATRIX B = identity_matrix<TYPE>(A.size2());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  lu_substitute(A, pm, B);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  assertTrue("inverse is correct: ", compare(B, INV));    
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return (getResults().second > 0) ? boost::exit_failure : boost::exit_success;
							 | 
						||
| 
								 | 
							
								}
							 |