1 #ifndef __JMATH__JMATRIXND__ 
    2 #define __JMATH__JMATRIXND__ 
   22 namespace JPP { 
using namespace JMATH; }
 
   84       if (size != this->
__n) {
 
   86         if (size > this->
__m) {
 
  142       for (
size_t row = 0; row != this->
size(); ++row) {
 
  143         for (
size_t col = 0; col != row; ++col) {
 
  144           swap((*
this)(row,col), (*
this)(col,row));
 
  240       return *(
__p + row*
__n + col);
 
  253       return *(
__p + row*
__n + col);
 
  264     double at(
size_t row, 
size_t col)
 const 
  266       if (row >= this->
size() ||
 
  267           col >= this->
size()) {
 
  271       return (*
this)(row, col);
 
  282     double& 
at(
size_t row, 
size_t col)
 
  284       if (row >= this->
size() ||
 
  285           col >= this->
size()) {
 
  289       return (*
this)(row, col);
 
  305     public JMath  <JMatrixND>,
 
  379       double* p = A.
data();
 
  381       for (
size_t i = this->
size(); i != 0; --i, ++p) {
 
  387       for (
size_t i = this->
size(); i != 0; --i, p += this->
size()) {
 
  388         memcpy(p, A.
data(), this->
size() * 
sizeof(double));
 
  404       for (
size_t i = 0; i != this->
size(); ++i) {
 
  419       double* p = this->
data();
 
  421       for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
 
  439         double*       p = this->
data();
 
  440         const double* q = A.
data();
 
  442         for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p, ++q) {
 
  462         double*       p = this->
data();
 
  463         const double* q = A.
data();
 
  465         for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p, ++q) {
 
  485       double* p = this->
data();
 
  487       for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
 
  503       double* p = this->
data();
 
  505       for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
 
  527         if (!this->
empty()) {
 
  536           for (row = 0; row + 4 <= this->
size(); row += 4) {              
 
  538             double* p0 = (*this)[row + 0];
 
  539             double* 
p1 = (*this)[row + 1];
 
  540             double* 
p2 = (*this)[row + 2];
 
  541             double* 
p3 = (*this)[row + 3];
 
  543             for (
size_t col = 0; col != this->
size(); ++col, ++p0, ++
p1, ++
p2, ++
p3) {
 
  550               const double* a0 =  A[row + 0];
 
  551               const double* a1 =  A[row + 1];
 
  552               const double* a2 =  A[row + 2];
 
  553               const double* a3 =  A[row + 3];
 
  555               const double* c0 =  C[col];
 
  557               for (i = 0; i + 4 <= this->
size(); i += 4, a0 += 4, a1 += 4, a2 += 4, a3 += 4, c0 += 4) {
 
  558                 w0  +=  a0[0] * c0[0]  +  a0[1] * c0[1]  +  a0[2] * c0[2]  +  a0[3] * c0[3];
 
  559                 w1  +=  a1[0] * c0[0]  +  a1[1] * c0[1]  +  a1[2] * c0[2]  +  a1[3] * c0[3];
 
  560                 w2  +=  a2[0] * c0[0]  +  a2[1] * c0[1]  +  a2[2] * c0[2]  +  a2[3] * c0[3];
 
  561                 w3  +=  a3[0] * c0[0]  +  a3[1] * c0[1]  +  a3[2] * c0[2]  +  a3[3] * c0[3];
 
  564               for ( ; i != this->
size(); ++i, ++a0, ++a1, ++a2, ++a3, ++c0) {
 
  578           for ( ; row != this->
size(); ++row) {                  
 
  580             double* p0 = (*this)[row + 0];
 
  582             for (
size_t col = 0; col != this->
size(); ++col, ++p0) {
 
  586               const double* a0 =  A[row + 0];
 
  587               const double* c0 =  C[col];
 
  589               for (i = 0; i + 4 <= this->
size(); i += 4, a0 += 4, c0 += 4) {
 
  590                 w0  +=  a0[0] * c0[0]  +  a0[1] * c0[1]  +  a0[2] * c0[2]  +  a0[3] * c0[3];
 
  593               for ( ; i != this->
size(); ++i, ++a0, ++c0) {
 
  618                 const double     eps = std::numeric_limits<double>::min())
 const 
  622         for (
size_t row = 0; row != this->
size(); ++row) {
 
  624           const double* p = (*this)[row];
 
  625           const double* q = A      [row];
 
  627           for (
size_t i = this->
size(); i != 0; --i, ++p, ++q) {
 
  628             if (fabs(*p - *q) > eps) {
 
  648     bool isIdentity(
const double eps = std::numeric_limits<double>::min())
 const 
  650       for (
size_t i = 0; i != this->
size(); ++i) {
 
  652         if (fabs(1.0 - (*
this)(i,i)) > eps) {
 
  656         for (
size_t j = 0; 
j != i; ++
j) {
 
  657           if (fabs((*
this)(i,
j)) > eps || fabs((*
this)(
j,i)) > eps) {
 
  673     bool isSymmetric(
const double eps = std::numeric_limits<double>::min())
 const 
  675       for (
size_t i = 0; i != this->
size(); ++i) {
 
  676         for (
size_t j = 0; 
j != i; ++
j) {
 
  677           if (fabs((*
this)(i,
j) - (*
this)(
j,i)) > eps) {
 
  699       for (
size_t i = 0; i != v.size(); ++i) {
 
  701         const double* p = (*this)[i];
 
  705         for (JVectorND::const_iterator y = v.begin(); y != v.end(); ++y, ++p) {
 
  733       for (
double* p = A.
data(); n != 0; --
n, ++p) {
 
  754       for (
const double* p = A.
data(); n != 0; --
n, ++p) {
 
  773       const JFormat format(out, getFormat<JMatrixND>(
JFormat_t(10, 3, std::ios::fixed | std::ios::showpos)));
 
  775       for (
size_t row = 0; row != A.
size(); ++row) {
 
  777         for (
size_t col = 0; col != A.
size(); ++col) {
 
  778           out << format << 
A(row,col) << 
' ';
 
  799       memcpy(A.
data(),    (*this)[r1], this->
size() * 
sizeof(double));
 
  800       memcpy((*
this)[r1], (*
this)[r2], this->
size() * 
sizeof(
double));
 
  801       memcpy((*
this)[r2], A.
data(),    this->
size() * 
sizeof(double));
 
  816       double* 
p2 = this->
data() + c2;
 
  818       for (
size_t i = this->
size(); i != 0; --i, p1 += this->
size(), p2 += this->
size()) {
 
JMatrixND(const JMatrixND &A)
Copy constructor. 
 
Exception for failure of memory allocation. 
 
Interface for binary output. 
 
Auxiliary base class for aritmetic operations of derived class types. 
 
JMatrixND & sub(const JMatrixND &A)
Matrix subtraction. 
 
double at(size_t row, size_t col) const 
Get matrix element. 
 
void clear()
Clear memory. 
 
JMatrixND & mul(const double factor)
Scale matrix. 
 
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message. 
 
JMatrixND & reset()
Set matrix to the null matrix. 
 
void resize(const size_t size)
Resize matrix. 
 
const double * operator[](size_t row) const 
Get row data. 
 
JMatrixND & operator=(const JMatrixND &A)
Assignment operator. 
 
~JMatrixND_t()
Destructor. 
 
double operator()(const size_t row, const size_t col) const 
Get matrix element. 
 
JMatrixND(const size_t size)
Constructor. 
 
friend JWriter & operator<<(JWriter &out, const JMatrixND &A)
Write matrix to output. 
 
static const double C
Physics constants. 
 
void set(const JMatrixND_t &A)
Set matrix. 
 
JMatrixND_t()
Default constructor. 
 
bool isIdentity(const double eps=std::numeric_limits< double >::min()) const 
Test identity. 
 
Template definition of auxiliary base class for comparison of data structures. 
 
double * data()
Get pointer to data. 
 
JMatrixND & add(const JMatrixND &A)
Matrix addition. 
 
Interface for binary input. 
 
bool equals(const JMatrixND &A, const double eps=std::numeric_limits< double >::min()) const 
Equality. 
 
void rswap(size_t r1, size_t r2)
 
friend JReader & operator>>(JReader &in, JMatrixND &A)
Read matrix from input. 
 
size_t size() const 
Get dimension of matrix. 
 
TCanvas * c1
Global variables to handle mouse events. 
 
JMatrixND & negate()
Negate matrix. 
 
double & at(size_t row, size_t col)
Get matrix element. 
 
size_t __n
dimension of matrix 
 
static data_type & getInstance()
Get unique instance of template class. 
 
alias put_queue eval echo n
 
double * __p
pointer to data 
 
bool isSymmetric(const double eps=std::numeric_limits< double >::min()) const 
Test symmetry. 
 
void resize(const size_t size)
Resize matrix. 
 
JMatrixND_t & transpose()
Transpose. 
 
Base class for data structures with artithmetic capabilities. 
 
void cswap(size_t c1, size_t c2)
Swap columns. 
 
size_t capacity() const 
Get capacity of dimension. 
 
JMatrixND()
Default constructor. 
 
void swap(JMatrixND_t &A)
Swap matrices. 
 
Exception for accessing an index in a collection that is outside of its range. 
 
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
 
double getDot(const JVectorND &v) const 
Get dot product. 
 
const double * data() const 
Get pointer to data. 
 
bool empty() const 
Check emptyness. 
 
double & operator()(const size_t row, const size_t col)
Get matrix element. 
 
size_t __m
capacity of matrix 
 
source $JPP_DIR setenv csh $JPP_DIR eval JShellParser o a A
 
JMatrixND & setIdentity()
Set to identity matrix. 
 
double * operator[](size_t row)
Get row data. 
 
JMatrixND & div(const double factor)
Scale matrix. 
 
friend std::ostream & operator<<(std::ostream &out, const JMatrixND &A)
Print ASCII formatted output. 
 
JMatrixND & mul(const JMatrixND &A, const JMatrixND &B)
Matrix multiplication.