Home || Visual Search || Applications || Architecture || Important Messages || OGL || Src

template<class C>
MatrixTem< C > Impala::Core::Matrix::MatrixTem< C >::i (  )  const

Inverse.

Definition at line 446 of file MatrixTem.h.

References Impala::Core::Matrix::MatrixTem< C >::_data, Impala::Core::Matrix::lubksb(), Impala::Core::Matrix::ludcmp(), Impala::Core::Matrix::MatrixTem< C >::nCol(), and Impala::Core::Matrix::MatrixTem< C >::nRow().

Referenced by Impala::Core::Matrix::MatrixTem< C >::covariance(), Impala::Core::Matrix::MatrixTem< C >::getCol(), Impala::Core::Matrix::MatrixTem< C >::getRow(), Impala::Core::Matrix::MatrixTem< C >::MatrixTem(), Impala::Core::Matrix::MatrixTem< C >::operator *(), Impala::Core::Matrix::MatrixTem< C >::operator+(), Impala::Core::Matrix::MatrixTem< C >::operator=(), Impala::Core::Array::regionDistance(), and Impala::Core::Matrix::MatrixTem< C >::t().

00447 {
00448     if (nRow() != nCol()) {
00449         std::cerr << "Inverse: matrix is not square!." << std::endl;
00450         return MatrixTem<C>(0, 0);
00451     }
00452 
00453     int size = nRow();
00454     MatrixTem<C> m(size,size), tmp(*this);
00455     short* idx = new short [size];
00456     double d;
00457 
00458     if (!ludcmp(tmp._data, size, idx, &d)) {
00459         std::cerr << "Inverse: singular matrix can't be inverted." << std::endl;
00460         delete [] idx;
00461         return MatrixTem<C>(0,0);
00462     }
00463     
00464     double * res = new double [size];
00465 
00466     for (int j = 0; j < size; j++) {
00467         for (int i = 0; i < size; i++)
00468             res[i] = 0.0;
00469         res[j] = 1.0;
00470         lubksb(tmp._data, size, idx, res);
00471         for (int i = 0; i < size; i++)
00472             m[i][j] = res[i];
00473     }
00474 
00475      delete [] res;
00476      delete [] idx;
00477 
00478      return m;
00479 }

Here is the call graph for this function:


Generated on Thu Jan 13 09:20:20 2011 for ImpalaSrc by  doxygen 1.5.1