1 #ifndef __JMATH__JMATRIXND__
2 #define __JMATH__JMATRIXND__
21 namespace JPP {
using namespace JMATH; }
106 if (size > this->
__m) {
132 double* p0 = this->
data();
133 double*
p1 = this->
data();
135 if (!this->
empty()) {
137 for (
size_t i = this->
size(); i != 0; --i, ++
p1) {
141 for (
size_t i = this->
size(); i != 1; --i,
p1 += this->
size()) {
142 memcpy(
p1, p0, this->
size() *
sizeof(
double));
187 for (
size_t row = 0; row != this->
size(); ++row) {
188 for (
size_t col = 0; col != row; ++col) {
189 swap((*
this)(row,col), (*
this)(col,row));
285 return *(
__p + row*
__n + col);
298 return *(
__p + row*
__n + col);
309 double at(
size_t row,
size_t col)
const
311 if (row >= this->
size() ||
312 col >= this->
size()) {
316 return (*
this)(row, col);
327 double&
at(
size_t row,
size_t col)
329 if (row >= this->
size() ||
330 col >= this->
size()) {
334 return (*
this)(row, col);
350 public JMath <JMatrixND>,
480 for (
size_t i = 0; i != this->
size(); ++i) {
495 double* p = this->
data();
497 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
515 double* p = this->
data();
516 const double* q = A.
data();
518 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p, ++q) {
540 double* p = this->
data();
541 const double* q = A.
data();
543 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p, ++q) {
563 double* p = this->
data();
565 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
581 double* p = this->
data();
583 for (
size_t i = this->
size()*this->
size(); i != 0; --i, ++p) {
605 if (!this->
empty()) {
614 for (row = 0; row + 4 <= this->
size(); row += 4) {
616 double* p0 = (*this)[row + 0];
617 double*
p1 = (*this)[row + 1];
618 double* p2 = (*this)[row + 2];
619 double* p3 = (*this)[row + 3];
621 for (
size_t col = 0; col != this->
size(); ++col, ++p0, ++
p1, ++p2, ++p3) {
628 const double* a0 = A[row + 0];
629 const double* a1 = A[row + 1];
630 const double* a2 = A[row + 2];
631 const double* a3 = A[row + 3];
633 const double* c0 =
C[col];
635 for (i = 0; i + 4 <= this->
size(); i += 4, a0 += 4, a1 += 4, a2 += 4, a3 += 4, c0 += 4) {
636 w0 += a0[0] * c0[0] + a0[1] * c0[1] + a0[2] * c0[2] + a0[3] * c0[3];
637 w1 += a1[0] * c0[0] + a1[1] * c0[1] + a1[2] * c0[2] + a1[3] * c0[3];
638 w2 += a2[0] * c0[0] + a2[1] * c0[1] + a2[2] * c0[2] + a2[3] * c0[3];
639 w3 += a3[0] * c0[0] + a3[1] * c0[1] + a3[2] * c0[2] + a3[3] * c0[3];
642 for ( ; i != this->
size(); ++i, ++a0, ++a1, ++a2, ++a3, ++c0) {
656 for ( ; row != this->
size(); ++row) {
658 double* p0 = (*this)[row + 0];
660 for (
size_t col = 0; col != this->
size(); ++col, ++p0) {
664 const double* a0 = A[row + 0];
665 const double* c0 =
C[col];
667 for (i = 0; i + 4 <= this->
size(); i += 4, a0 += 4, c0 += 4) {
668 w0 += a0[0] * c0[0] + a0[1] * c0[1] + a0[2] * c0[2] + a0[3] * c0[3];
671 for ( ; i != this->
size(); ++i, ++a0, ++c0) {
696 const double eps = std::numeric_limits<double>::min())
const
700 for (
size_t row = 0; row != this->
size(); ++row) {
702 const double* p = (*this)[row];
703 const double* q = A [row];
705 for (
size_t i = this->
size(); i != 0; --i, ++p, ++q) {
706 if (fabs(*p - *q) > eps) {
726 bool isIdentity(
const double eps = std::numeric_limits<double>::min())
const
728 for (
size_t i = 0; i != this->
size(); ++i) {
730 if (fabs(1.0 - (*
this)(i,i)) > eps) {
734 for (
size_t j = 0;
j != i; ++
j) {
735 if (fabs((*
this)(i,
j)) > eps || fabs((*
this)(
j,i)) > eps) {
751 bool isSymmetric(
const double eps = std::numeric_limits<double>::min())
const
753 for (
size_t i = 0; i != this->
size(); ++i) {
754 for (
size_t j = 0;
j != i; ++
j) {
755 if (fabs((*
this)(i,
j) - (*
this)(
j,i)) > eps) {
777 for (
size_t i = 0; i !=
v.size(); ++i) {
779 const double* p = (*this)[i];
783 for (JVectorND::const_iterator
y =
v.begin();
y !=
v.end(); ++
y, ++p) {
811 for (
double* p = A.
data();
n != 0; --
n, ++p) {
832 for (
const double* p = A.
data();
n != 0; --
n, ++p) {
851 const JFormat format(out, getFormat<JMatrixND>(
JFormat_t(10, 3, std::ios::fixed | std::ios::showpos)));
853 for (
size_t row = 0; row != A.
size(); ++row) {
855 for (
size_t col = 0; col != A.
size(); ++col) {
856 out << format << A(row,col) <<
' ';
879 memcpy(A.
data(), (*
this)[r1], this->size() *
sizeof(
double));
880 memcpy((*
this)[r1], (*
this)[r2], this->
size() *
sizeof(
double));
881 memcpy((*
this)[r2], A.
data(), this->size() *
sizeof(
double));
896 double* p2 = this->
data() + c2;
898 for (
size_t i = this->
size(); i != 0; --i,
p1 += this->
size(), p2 += this->
size()) {
TCanvas * c1
Global variables to handle mouse events.
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
Base class for data structures with artithmetic capabilities.
Interface for binary input.
Interface for binary output.
Exception for accessing an index in a collection that is outside of its range.
Exception for failure of memory allocation.
Auxiliary classes and methods for mathematical operations.
static const double C
Physics constants.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Template definition of auxiliary base class for comparison of data structures.
Auxiliary base class for aritmetic operations of derived class types.
JMatrixND_t & reset()
Set matrix to the null matrix.
size_t size() const
Get dimension of matrix.
double * data()
Get pointer to data.
const double * operator[](size_t row) const
Get row data.
double & operator()(const size_t row, const size_t col)
Get matrix element.
double at(size_t row, size_t col) const
Get matrix element.
const double * data() const
Get pointer to data.
~JMatrixND_t()
Destructor.
void clear()
Clear memory.
void set(const JMatrixND_t &A)
Set matrix.
void swap(JMatrixND_t &A)
Swap matrices.
size_t capacity() const
Get capacity of dimension.
JMatrixND_t & transpose()
Transpose.
JMatrixND_t(const JMatrixND_t &A)
Copy constructor.
double * __p
pointer to data
double operator()(const size_t row, const size_t col) const
Get matrix element.
JMatrixND_t()
Default constructor.
size_t __m
capacity of matrix
double * operator[](size_t row)
Get row data.
bool empty() const
Check emptyness.
double & at(size_t row, size_t col)
Get matrix element.
JMatrixND_t(JMatrixND_t &&A)
Move constructor.
void resize(const size_t size)
Resize matrix.
size_t __n
dimension of matrix
friend std::ostream & operator<<(std::ostream &out, const JMatrixND &A)
Print ASCII formatted output.
void cswap(size_t c1, size_t c2)
Swap columns.
JMatrixND()
Default constructor.
JMatrixND & sub(const JMatrixND &A)
Matrix subtraction.
JMatrixND & add(const JMatrixND &A)
Matrix addition.
void resize(const size_t size)
Resize matrix.
friend JReader & operator>>(JReader &in, JMatrixND &A)
Read matrix from input.
JMatrixND & operator=(const JMatrixND &A)
Assignment operator.
JMatrixND & div(const double factor)
Scale matrix.
JMatrixND_t & getInstance()
Get work space.
bool equals(const JMatrixND &A, const double eps=std::numeric_limits< double >::min()) const
Equality.
bool isIdentity(const double eps=std::numeric_limits< double >::min()) const
Test identity.
JMatrixND & setIdentity()
Set to identity matrix.
double getDot(const JVectorND &v) const
Get dot product.
JMatrixND & reset()
Set matrix to the null matrix.
JMatrixND & operator=(JMatrixND &&A)
Move assignment operator.
friend JWriter & operator<<(JWriter &out, const JMatrixND &A)
Write matrix to output.
JMatrixND(JMatrixND &&A)
Move constructor.
JMatrixND & negate()
Negate matrix.
JMatrixND(const JMatrixND &A)
Copy constructor.
bool isSymmetric(const double eps=std::numeric_limits< double >::min()) const
Test symmetry.
JMatrixND(const size_t size)
Constructor.
void rswap(size_t r1, size_t r2)
JMatrixND & mul(const JMatrixND &A, const JMatrixND &B)
Matrix multiplication.
JMatrixND & mul(const double factor)
Scale matrix.