1 #ifndef __JMATH__JMATRIXND__
2 #define __JMATH__JMATRIXND__
19 namespace JPP {
using namespace JMATH; }
81 if (size != this->
__n) {
83 if (size > this->
__m) {
139 for (
size_t row = 0; row != this->
size(); ++row) {
140 for (
size_t col = 0; col != row; ++col) {
141 swap((*
this)(row,col), (*
this)(col,row));
237 return *(
__p + row*
__n + col);
250 return *(
__p + row*
__n + col);
261 double at(
size_t row,
size_t col)
const
263 if (row >= this->
size() ||
264 col >= this->
size()) {
268 return (*
this)(row, col);
279 double&
at(
size_t row,
size_t col)
281 if (row >= this->
size() ||
282 col >= this->
size()) {
286 return (*
this)(row, col);
302 public JMath <JMatrixND>,
376 double* p = A.
data();
378 for (
size_t i = this->
size(); i != 0; --i, ++p) {
384 for (
size_t i = this->
size(); i != 0; --i, p += this->
size()) {
385 memcpy(p, A.
data(), this->
size() *
sizeof(double));
401 for (
size_t i = 0; i != this->
size(); ++i) {
416 double* p = this->
data();
418 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
436 double* p = this->
data();
437 const double* q = A.
data();
439 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p, ++q) {
459 double* p = this->
data();
460 const double* q = A.
data();
462 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p, ++q) {
482 double* p = this->
data();
484 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
500 double* p = this->
data();
502 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
524 if (!this->
empty()) {
533 for (row = 0; row + 4 <= this->
size(); row += 4) {
535 double* p0 = (*this)[row + 0];
536 double*
p1 = (*this)[row + 1];
537 double* p2 = (*this)[row + 2];
538 double* p3 = (*this)[row + 3];
540 for (
size_t col = 0; col != this->
size(); ++col, ++p0, ++
p1, ++p2, ++p3) {
547 const double* a0 = A[row + 0];
548 const double* a1 = A[row + 1];
549 const double* a2 = A[row + 2];
550 const double* a3 = A[row + 3];
552 const double* c0 = C[col];
554 for (i = 0; i + 4 <= this->
size(); i += 4, a0 += 4, a1 += 4, a2 += 4, a3 += 4, c0 += 4) {
555 w0 += a0[0] * c0[0] + a0[1] * c0[1] + a0[2] * c0[2] + a0[3] * c0[3];
556 w1 += a1[0] * c0[0] + a1[1] * c0[1] + a1[2] * c0[2] + a1[3] * c0[3];
557 w2 += a2[0] * c0[0] + a2[1] * c0[1] + a2[2] * c0[2] + a2[3] * c0[3];
558 w3 += a3[0] * c0[0] + a3[1] * c0[1] + a3[2] * c0[2] + a3[3] * c0[3];
561 for ( ; i != this->
size(); ++i, ++a0, ++a1, ++a2, ++a3, ++c0) {
575 for ( ; row != this->
size(); ++row) {
577 double* p0 = (*this)[row + 0];
579 for (
size_t col = 0; col != this->
size(); ++col, ++p0) {
583 const double* a0 = A[row + 0];
584 const double* c0 = C[col];
586 for (i = 0; i + 4 <= this->
size(); i += 4, a0 += 4, c0 += 4) {
587 w0 += a0[0] * c0[0] + a0[1] * c0[1] + a0[2] * c0[2] + a0[3] * c0[3];
590 for ( ; i != this->
size(); ++i, ++a0, ++c0) {
615 const double eps = std::numeric_limits<double>::min())
const
619 for (
size_t row = 0; row != this->
size(); ++row) {
621 const double* p = (*this)[row];
622 const double* q = A [row];
624 for (
size_t i = this->
size(); i != 0; --i, ++p, ++q) {
625 if (fabs(*p - *q) > eps) {
645 bool isIdentity(
const double eps = std::numeric_limits<double>::min())
const
647 for (
size_t i = 0; i != this->
size(); ++i) {
649 if (fabs(1.0 - (*
this)(i,i)) > eps) {
653 for (
size_t j = 0;
j != i; ++
j) {
654 if (fabs((*
this)(i,
j)) > eps || fabs((*
this)(
j,i)) > eps) {
670 bool isSymmetric(
const double eps = std::numeric_limits<double>::min())
const
672 for (
size_t i = 0; i != this->
size(); ++i) {
673 for (
size_t j = 0;
j != i; ++
j) {
674 if (fabs((*
this)(i,
j) - (*
this)(
j,i)) > eps) {
696 for (
size_t i = 0; i != v.size(); ++i) {
698 const double* p = (*this)[i];
702 for (JVectorND::const_iterator y = v.begin(); y != v.end(); ++y, ++p) {
730 for (
double* p = A.
data(); n != 0; --
n, ++p) {
751 for (
const double* p = A.
data(); n != 0; --
n, ++p) {
772 for (
size_t row = 0; row != A.
size(); ++row) {
774 for (
size_t col = 0; col != A.
size(); ++col) {
775 out <<
FIXED(10,3) <<
A(row,col) <<
' ';
796 memcpy(A.
data(), (*this)[r1], this->
size() *
sizeof(double));
797 memcpy((*
this)[r1], (*
this)[r2], this->
size() *
sizeof(
double));
798 memcpy((*
this)[r2], A.
data(), this->
size() *
sizeof(double));
813 double* p2 = this->
data() + c2;
815 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.
esac print_variable DETECTOR INPUT_FILE OUTPUT_FILE CDF for TYPE in
JMatrixND & reset()
Set matrix to the null matrix.
Auxiliary data structure for floating point format specification.
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.
void set(const JMatrixND_t &A)
Set matrix.
I/O formatting auxiliaries.
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.
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
Auxiliary class to temporarily modify format specifications.
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.