Fn_solve

Functions

template<typename eT , typename T1 , typename T2 >
bool solve (Mat< eT > &X, const Base< eT, T1 > &A_in, const Base< eT, T2 > &B_in)
 Solve a system of linear equations, i.e., A*X = B, where X is unknown. For a square matrix A, this function is conceptually the same as X = inv(A)*B, but is done more efficiently. The number of rows in A and B must be the same. B can be either a column vector or a matrix. This function will also try to provide approximate solutions to under-determined as well as over-determined systems (non-square A matrices).
template<typename eT , typename T1 , typename T2 >
Mat< eT > solve (const Base< eT, T1 > &A_in, const Base< eT, T2 > &B_in)

Function Documentation

template<typename eT , typename T1 , typename T2 >
bool solve ( Mat< eT > &  X,
const Base< eT, T1 > &  A_in,
const Base< eT, T2 > &  B_in 
) [inline]

Solve a system of linear equations, i.e., A*X = B, where X is unknown. For a square matrix A, this function is conceptually the same as X = inv(A)*B, but is done more efficiently. The number of rows in A and B must be the same. B can be either a column vector or a matrix. This function will also try to provide approximate solutions to under-determined as well as over-determined systems (non-square A matrices).

Definition at line 33 of file fn_solve.hpp.

References Base< elem_type, derived >::get_ref(), Mat< eT >::n_rows, Mat< eT >::reset(), auxlib::solve(), auxlib::solve_od(), and auxlib::solve_ud().

Referenced by solve().

00034   {
00035   arma_extra_debug_sigprint();
00036   
00037   const unwrap<T1> tmp1(A_in.get_ref());
00038   const unwrap<T2> tmp2(B_in.get_ref());
00039   
00040   const Mat<eT>& A = tmp1.M;
00041   const Mat<eT>& B = tmp2.M;
00042   
00043   arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in A and B must be the same" );
00044   
00045   bool status;
00046   
00047   if(A.n_rows == A.n_cols)
00048     {
00049     status = auxlib::solve(X, A, B);
00050     }
00051   else
00052   if(A.n_rows > A.n_cols)
00053     {
00054     arma_extra_debug_print("solve(): detected over-determined system");
00055     status = auxlib::solve_od(X, A, B);
00056     }
00057   else
00058     {
00059     arma_extra_debug_print("solve(): detected under-determined system");
00060     status = auxlib::solve_ud(X, A, B);
00061     }
00062   
00063   if(status == false)
00064     {
00065     X.reset();
00066     }
00067   
00068   return status;
00069   }

template<typename eT , typename T1 , typename T2 >
Mat<eT> solve ( const Base< eT, T1 > &  A_in,
const Base< eT, T2 > &  B_in 
) [inline]

Definition at line 76 of file fn_solve.hpp.

References arma_print(), Mat< eT >::reset(), and solve().

00077   {
00078   arma_extra_debug_sigprint();
00079   
00080   Mat<eT> X;
00081   const bool status = solve(X, A_in, B_in);
00082   
00083   if(status == false)
00084     {
00085     arma_print("solve(): solution not found");
00086     
00087     X.reset();
00088     }
00089   
00090   return X;
00091   }