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 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.