1 #ifndef __JMATH__JMATRIXND__
2 #define __JMATH__JMATRIXND__
22 namespace JPP {
using namespace JMATH; }
108 if (size != this->
__n) {
110 if (size > this->
__m) {
120 THROW(
JNewException,
"JMatrixND::resize(" << size <<
"): Memory allocation failure.");
166 for (
size_t row = 0; row != this->
size(); ++row) {
167 for (
size_t col = 0; col != row; ++col) {
168 swap((*
this)(row,col), (*
this)(col,row));
264 return *(
__p + row*
__n + col);
277 return *(
__p + row*
__n + col);
288 double at(
size_t row,
size_t col)
const
290 if (row >= this->
size() ||
291 col >= this->
size()) {
295 return (*
this)(row, col);
306 double&
at(
size_t row,
size_t col)
308 if (row >= this->
size() ||
309 col >= this->
size()) {
313 return (*
this)(row, col);
329 public JMath <JMatrixND>,
427 double* p = A.
data();
429 for (
size_t i = this->
size(); i != 0; --i, ++p) {
435 for (
size_t i = this->
size(); i != 0; --i, p += this->
size()) {
436 memcpy(p, A.
data(), this->
size() *
sizeof(double));
452 for (
size_t i = 0; i != this->
size(); ++i) {
467 double* p = this->
data();
469 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
487 double* p = this->
data();
488 const double* q = A.
data();
490 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p, ++q) {
510 double* p = this->
data();
511 const double* q = A.
data();
513 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p, ++q) {
533 double* p = this->
data();
535 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
551 double* p = this->
data();
553 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
575 if (!this->
empty()) {
584 for (row = 0; row + 4 <= this->
size(); row += 4) {
586 double* p0 = (*this)[row + 0];
587 double*
p1 = (*this)[row + 1];
588 double*
p2 = (*this)[row + 2];
589 double*
p3 = (*this)[row + 3];
591 for (
size_t col = 0; col != this->
size(); ++col, ++p0, ++
p1, ++
p2, ++
p3) {
598 const double* a0 = A[row + 0];
599 const double* a1 = A[row + 1];
600 const double* a2 = A[row + 2];
601 const double* a3 = A[row + 3];
603 const double* c0 = C[col];
605 for (i = 0; i + 4 <= this->
size(); i += 4, a0 += 4, a1 += 4, a2 += 4, a3 += 4, c0 += 4) {
606 w0 += a0[0] * c0[0] + a0[1] * c0[1] + a0[2] * c0[2] + a0[3] * c0[3];
607 w1 += a1[0] * c0[0] + a1[1] * c0[1] + a1[2] * c0[2] + a1[3] * c0[3];
608 w2 += a2[0] * c0[0] + a2[1] * c0[1] + a2[2] * c0[2] + a2[3] * c0[3];
609 w3 += a3[0] * c0[0] + a3[1] * c0[1] + a3[2] * c0[2] + a3[3] * c0[3];
612 for ( ; i != this->
size(); ++i, ++a0, ++a1, ++a2, ++a3, ++c0) {
626 for ( ; row != this->
size(); ++row) {
628 double* p0 = (*this)[row + 0];
630 for (
size_t col = 0; col != this->
size(); ++col, ++p0) {
634 const double* a0 = A[row + 0];
635 const double* c0 = C[col];
637 for (i = 0; i + 4 <= this->
size(); i += 4, a0 += 4, c0 += 4) {
638 w0 += a0[0] * c0[0] + a0[1] * c0[1] + a0[2] * c0[2] + a0[3] * c0[3];
641 for ( ; i != this->
size(); ++i, ++a0, ++c0) {
666 const double eps = std::numeric_limits<double>::min())
const
670 for (
size_t row = 0; row != this->
size(); ++row) {
672 const double* p = (*this)[row];
673 const double* q = A [row];
675 for (
size_t i = this->
size(); i != 0; --i, ++p, ++q) {
676 if (fabs(*p - *q) > eps) {
696 bool isIdentity(
const double eps = std::numeric_limits<double>::min())
const
698 for (
size_t i = 0; i != this->
size(); ++i) {
700 if (fabs(1.0 - (*
this)(i,i)) > eps) {
704 for (
size_t j = 0;
j != i; ++
j) {
705 if (fabs((*
this)(i,
j)) > eps || fabs((*
this)(
j,i)) > eps) {
721 bool isSymmetric(
const double eps = std::numeric_limits<double>::min())
const
723 for (
size_t i = 0; i != this->
size(); ++i) {
724 for (
size_t j = 0;
j != i; ++
j) {
725 if (fabs((*
this)(i,
j) - (*
this)(
j,i)) > eps) {
747 for (
size_t i = 0; i != v.size(); ++i) {
749 const double* p = (*this)[i];
753 for (JVectorND::const_iterator y = v.begin(); y != v.end(); ++y, ++p) {
781 for (
double* p = A.
data(); n != 0; --
n, ++p) {
802 for (
const double* p = A.
data(); n != 0; --
n, ++p) {
821 const JFormat format(out, getFormat<JMatrixND>(
JFormat_t(10, 3, std::ios::fixed | std::ios::showpos)));
823 for (
size_t row = 0; row != A.
size(); ++row) {
825 for (
size_t col = 0; col != A.
size(); ++col) {
826 out << format <<
A(row,col) <<
' ';
847 memcpy(A.
data(), (*this)[r1], this->
size() *
sizeof(double));
848 memcpy((*
this)[r1], (*
this)[r2], this->
size() *
sizeof(
double));
849 memcpy((*
this)[r2], A.
data(), this->
size() *
sizeof(double));
864 double*
p2 = this->
data() + c2;
866 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_t(const JMatrixND_t &A)
Copy constructor.
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
JMatrixND & operator=(JMatrixND &&A)
Move assignment operator.
static data_type & getInstance()
Get unique instance of template class.
JMatrixND_t(JMatrixND_t &&A)
Move constructor.
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.
JMatrixND(JMatrixND &&A)
Move constructor.
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
source $JPP_DIR setenv csh $JPP_DIR &dev null eval JShellParser o a A
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
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.