1 #ifndef __JMATH__JMATRIXND__
2 #define __JMATH__JMATRIXND__
21 namespace JPP {
using namespace JMATH; }
104 if (size != this->
__n) {
106 if (size > this->
__m) {
116 THROW(
JNewException,
"JMatrixND::resize(" << size <<
"): Memory allocation failure.");
162 for (
size_t row = 0; row != this->
size(); ++row) {
163 for (
size_t col = 0; col != row; ++col) {
164 swap((*
this)(row,col), (*
this)(col,row));
260 return *(
__p + row*
__n + col);
273 return *(
__p + row*
__n + col);
284 double at(
size_t row,
size_t col)
const
286 if (row >= this->
size() ||
287 col >= this->
size()) {
291 return (*
this)(row, col);
302 double&
at(
size_t row,
size_t col)
304 if (row >= this->
size() ||
305 col >= this->
size()) {
309 return (*
this)(row, col);
325 public JMath <JMatrixND>,
440 double* p = A.
data();
442 for (
size_t i = this->
size(); i != 0; --i, ++p) {
448 for (
size_t i = this->
size(); i != 0; --i, p += this->
size()) {
449 memcpy(p, A.
data(), this->
size() *
sizeof(double));
465 for (
size_t i = 0; i != this->
size(); ++i) {
480 double* p = this->
data();
482 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
500 double* p = this->
data();
501 const double* q = A.
data();
503 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p, ++q) {
523 double* p = this->
data();
524 const double* q = A.
data();
526 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p, ++q) {
546 double* p = this->
data();
548 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
564 double* p = this->
data();
566 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
588 if (!this->
empty()) {
597 for (row = 0; row + 4 <= this->
size(); row += 4) {
599 double* p0 = (*this)[row + 0];
600 double*
p1 = (*this)[row + 1];
601 double*
p2 = (*this)[row + 2];
602 double*
p3 = (*this)[row + 3];
604 for (
size_t col = 0; col != this->
size(); ++col, ++p0, ++
p1, ++
p2, ++
p3) {
611 const double* a0 = A[row + 0];
612 const double* a1 = A[row + 1];
613 const double* a2 = A[row + 2];
614 const double* a3 = A[row + 3];
616 const double* c0 = C[col];
618 for (i = 0; i + 4 <= this->
size(); i += 4, a0 += 4, a1 += 4, a2 += 4, a3 += 4, c0 += 4) {
619 w0 += a0[0] * c0[0] + a0[1] * c0[1] + a0[2] * c0[2] + a0[3] * c0[3];
620 w1 += a1[0] * c0[0] + a1[1] * c0[1] + a1[2] * c0[2] + a1[3] * c0[3];
621 w2 += a2[0] * c0[0] + a2[1] * c0[1] + a2[2] * c0[2] + a2[3] * c0[3];
622 w3 += a3[0] * c0[0] + a3[1] * c0[1] + a3[2] * c0[2] + a3[3] * c0[3];
625 for ( ; i != this->
size(); ++i, ++a0, ++a1, ++a2, ++a3, ++c0) {
639 for ( ; row != this->
size(); ++row) {
641 double* p0 = (*this)[row + 0];
643 for (
size_t col = 0; col != this->
size(); ++col, ++p0) {
647 const double* a0 = A[row + 0];
648 const double* c0 = C[col];
650 for (i = 0; i + 4 <= this->
size(); i += 4, a0 += 4, c0 += 4) {
651 w0 += a0[0] * c0[0] + a0[1] * c0[1] + a0[2] * c0[2] + a0[3] * c0[3];
654 for ( ; i != this->
size(); ++i, ++a0, ++c0) {
679 const double eps = std::numeric_limits<double>::min())
const
683 for (
size_t row = 0; row != this->
size(); ++row) {
685 const double* p = (*this)[row];
686 const double* q = A [row];
688 for (
size_t i = this->
size(); i != 0; --i, ++p, ++q) {
689 if (fabs(*p - *q) > eps) {
709 bool isIdentity(
const double eps = std::numeric_limits<double>::min())
const
711 for (
size_t i = 0; i != this->
size(); ++i) {
713 if (fabs(1.0 - (*
this)(i,i)) > eps) {
717 for (
size_t j = 0;
j != i; ++
j) {
718 if (fabs((*
this)(i,
j)) > eps || fabs((*
this)(
j,i)) > eps) {
734 bool isSymmetric(
const double eps = std::numeric_limits<double>::min())
const
736 for (
size_t i = 0; i != this->
size(); ++i) {
737 for (
size_t j = 0;
j != i; ++
j) {
738 if (fabs((*
this)(i,
j) - (*
this)(
j,i)) > eps) {
760 for (
size_t i = 0; i != v.size(); ++i) {
762 const double* p = (*this)[i];
766 for (JVectorND::const_iterator y = v.begin(); y != v.end(); ++y, ++p) {
794 for (
double* p = A.
data(); n != 0; --
n, ++p) {
815 for (
const double* p = A.
data(); n != 0; --
n, ++p) {
834 const JFormat format(out, getFormat<JMatrixND>(
JFormat_t(10, 3, std::ios::fixed | std::ios::showpos)));
836 for (
size_t row = 0; row != A.
size(); ++row) {
838 for (
size_t col = 0; col != A.
size(); ++col) {
839 out << format <<
A(row,col) <<
' ';
862 memcpy(A.
data(), (*this)[r1], this->
size() *
sizeof(double));
863 memcpy((*
this)[r1], (*
this)[r2], this->
size() *
sizeof(
double));
864 memcpy((*
this)[r2], A.
data(), this->
size() *
sizeof(double));
879 double*
p2 = this->
data() + c2;
881 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_t & getInstance()
Get work space.
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.
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 JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS 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.