1 #ifndef __JMATH__JMATRIXNS__ 
    2 #define __JMATH__JMATRIXNS__ 
   17 namespace JPP { 
using namespace JMATH; }
 
   79       size_t  i, row, col, 
root;
 
   95       P.resize(this->
size());
 
   99       for (root = 0; 
root != this->
size(); ++root) {
 
  104         for (row = 
root; ++row != this->
size(); ) {
 
  105           if (fabs((*
this)(row, 
root)) > fabs(value)) {
 
  106             value = (*this)(row, 
root);
 
  116           this->
rswap(root, pivot);
 
  121         for (row = 
root + 1; row + 4 <= this->
size(); row += 4) {            
 
  123           p0 = (*this)[row + 0]  +  
root;
 
  124           p1 = (*this)[row + 1]  +  
root;
 
  125           p2 = (*this)[row + 2]  +  
root;
 
  126           p3 = (*this)[row + 3]  +  
root;
 
  128           v0 = (*p0++ /= value);
 
  129           v1 = (*
p1++ /= value);
 
  130           v2 = (*p2++ /= value);
 
  131           v3 = (*p3++ /= value);
 
  135           for (i = 
root + 1; i + 4 <= this->
size(); i += 4, p0 += 4, 
p1 += 4, p2 += 4, p3 += 4, c0 += 4) {
 
  136             p0[0] -= v0 * c0[0];  p0[1] -= v0 * c0[1];  p0[2] -= v0 * c0[2];  p0[3] -= v0 * c0[3];
 
  137             p1[0] -= v1 * c0[0];  
p1[1] -= v1 * c0[1];  
p1[2] -= v1 * c0[2];  
p1[3] -= v1 * c0[3];
 
  138             p2[0] -= v2 * c0[0];  p2[1] -= v2 * c0[1];  p2[2] -= v2 * c0[2];  p2[3] -= v2 * c0[3];
 
  139             p3[0] -= v3 * c0[0];  p3[1] -= v3 * c0[1];  p3[2] -= v3 * c0[2];  p3[3] -= v3 * c0[3];
 
  142           for ( ; i != this->
size(); ++i, ++p0, ++
p1, ++p2, ++p3, ++c0) {
 
  150         for ( ; row != this->
size(); ++row) {                                
 
  152           p0 = (*this)[row + 0]  +  
root;
 
  154           v0 = (*p0++ /= value);
 
  158           for (i = 
root + 1; i + 4 <= this->
size(); i += 4, p0 += 4, c0 += 4) {
 
  159             *p0 -= v0 * c0[0];  p0[1] -= v0 * c0[1];  p0[2] -= v0 * c0[2];  p0[3] -= v0 * c0[3];
 
  162           for ( ; i != this->
size(); ++i, ++p0, ++c0) {
 
  173       for (i = 0; i != this->
size(); ++i) {
 
  182       for ( ; col + 4 <= this->
size(); col += 4) {
 
  184         for (row = 0; row != this->
size(); ++row) {
 
  203           for (i = 0, c0 = (*
this)[row]; i != row; ++c0, ++p0, ++
p1, ++p2, ++p3, ++i) {
 
  210           A[col + 0][row] = v0;
 
  211           A[col + 1][row] = v1;
 
  212           A[col + 2][row] = v2;
 
  213           A[col + 3][row] = v3;
 
  217       for ( ; col != this->
size(); ++col) {
 
  219         for (row = 0; row != this->
size(); ++row) {
 
  229           for (i = 0, c0 = (*
this)[row] + i; i != row; ++c0, ++p0, ++i) {
 
  241       for ( ; col + 4 <= this->
size(); col += 4) {
 
  243         for (
int row = this->
size() - 1; row >= 0; --row) {
 
  245           p0 = A[col + 0] + row;
 
  246           p1 = A[col + 1] + row;
 
  247           p2 = A[col + 2] + row;
 
  248           p3 = A[col + 3] + row;
 
  260           for (i = row + 1, c0 = (*
this)[row] + i; i != this->
size(); ++c0, ++p0, ++
p1, ++p2, ++p3, ++i) {
 
  267           w0 = 1.0 / (*this)[row][row];
 
  269           A[col + 0][row] = v0 * w0;
 
  270           A[col + 1][row] = v1 * w0;
 
  271           A[col + 2][row] = v2 * w0;
 
  272           A[col + 3][row] = v3 * w0;
 
  276       for ( ; col != this->
size(); ++col) {
 
  278         for (
int row = this->
size() - 1; row >= 0; --row) {
 
  286           for (i = row + 1, c0 = (*
this)[row] + i; i != this->
size(); ++c0, ++p0, ++i) {
 
  290           w0 = 1.0 / (*this)[row][row];
 
  292           A[col][row] = v0 * w0;
 
  307     template<
class JVectorND_t>
 
  326       P.resize(this->
size());
 
  330       for (root = 0; 
root != this->
size(); ++root) {
 
  335         for (row = 
root; ++row != this->
size(); ) {
 
  336           if (fabs((*
this)(row, 
root)) > fabs(value)) {
 
  337             value = (*this)(row, 
root);
 
  347           this->
rswap(root, pivot);
 
  352         for (row = 
root + 1; row + 4 <= this->
size(); row += 4) {            
 
  354           p0 = (*this)[row + 0]  +  
root;
 
  355           p1 = (*this)[row + 1]  +  
root;
 
  356           p2 = (*this)[row + 2]  +  
root;
 
  357           p3 = (*this)[row + 3]  +  
root;
 
  359           v0 = (*p0++ /= value);
 
  360           v1 = (*
p1++ /= value);
 
  361           v2 = (*p2++ /= value);
 
  362           v3 = (*p3++ /= value);
 
  366           for (i = 
root + 1; i + 4 <= this->
size(); i += 4, p0 += 4, 
p1 += 4, p2 += 4, p3 += 4, c0 += 4) {
 
  367             p0[0] -= v0 * c0[0];  p0[1] -= v0 * c0[1];  p0[2] -= v0 * c0[2];  p0[3] -= v0 * c0[3];
 
  368             p1[0] -= v1 * c0[0];  
p1[1] -= v1 * c0[1];  
p1[2] -= v1 * c0[2];  
p1[3] -= v1 * c0[3];
 
  369             p2[0] -= v2 * c0[0];  p2[1] -= v2 * c0[1];  p2[2] -= v2 * c0[2];  p2[3] -= v2 * c0[3];
 
  370             p3[0] -= v3 * c0[0];  p3[1] -= v3 * c0[1];  p3[2] -= v3 * c0[2];  p3[3] -= v3 * c0[3];
 
  373           for ( ; i != this->
size(); ++i, ++p0, ++
p1, ++p2, ++p3, ++c0) {
 
  381         for ( ; row != this->
size(); ++row) {                                
 
  383           p0 = (*this)[row + 0]  +  
root;
 
  385           v0 = (*p0++ /= value);
 
  389           for (i = 
root + 1; i + 4 <= this->
size(); i += 4, p0 += 4, c0 += 4) {
 
  390             *p0 -= v0 * c0[0];  p0[1] -= v0 * c0[1];  p0[2] -= v0 * c0[2];  p0[3] -= v0 * c0[3];
 
  393           for ( ; i != this->
size(); ++i, ++p0, ++c0) {
 
  401       for (row = 0; row != this->
size(); ++row) {
 
  407         for (i = 0, c0 = (*
this)[row] + i; i != row; ++c0, ++i) {
 
  416       for (
int row = this->
size() - 1; row >= 0; --row) {
 
  420         for (i = row + 1, c0 = (*
this)[row] + i; i < this->
size(); ++c0, ++i) {
 
  424         u[row] = v0 / (*this)[row][row];
 
  446     void update(
const size_t k, 
const double value)
 
  448       if (k >= this->
size()) {
 
  455       const double del  =  (*this)(k,k);
 
  456       const double din  =  1.0 / (1.0 + value * del);
 
  458       double* 
root = (*this)[k];
 
  460       for (row = 0; row != this->
size(); ++row) {
 
  464           const double val = (*this)(row, k);
 
  466           for (i = 0, col = (*
this)[row]; i != this->
size(); ++i, ++col) {
 
  468               (*col) -= val * 
root[i] * value * din;
 
  472           (*this)(row, k) *= din;
 
  476       for (i = 0, col = 
root; i != this->
size(); ++i, ++col) {
 
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
 
Exception for division by zero.
 
Exception for accessing an index in a collection that is outside of its range.
 
Auxiliary classes and methods for mathematical operations.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
JMatrixND_t & reset()
Set matrix to the null matrix.
 
size_t size() const
Get dimension of matrix.
 
void set(const JMatrixND_t &A)
Set matrix.
 
void swap(JMatrixND_t &A)
Swap matrices.
 
JMatrixND_t & transpose()
Transpose.
 
JMatrixND_t & getInstance()
Get work space.
 
void rswap(size_t r1, size_t r2)
 
JMatrixNS & operator=(const JMatrixNS &A)
Assignment operator.
 
void update(const size_t k, const double value)
Update inverted matrix at given diagonal element.
 
JMatrixNS()
Default constructor.
 
void solve(JVectorND_t &u)
Get solution of equation A x = b.
 
JMatrixNS(const size_t size)
Constructor (identity matrix).
 
std::vector< int > P
permutation matrix
 
JMatrixNS(const JMatrixND &A)
Contructor.
 
void invert()
Invert matrix according LDU decomposition.