*** empty log message ***
This commit is contained in:
parent
4bdb1ffa00
commit
badd89dcdb
152
mat.cc
152
mat.cc
@ -14,43 +14,7 @@ template NRMat<char>;
|
|||||||
* Templates first, specializations for BLAS next
|
* Templates first, specializations for BLAS next
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// dtor
|
|
||||||
template <typename T>
|
|
||||||
NRMat<T>::~NRMat()
|
|
||||||
{
|
|
||||||
if (!count) return;
|
|
||||||
if (--(*count) <= 0) {
|
|
||||||
if (v) {
|
|
||||||
#ifdef MATPTR
|
|
||||||
delete[] (v[0]);
|
|
||||||
#endif
|
|
||||||
delete[] v;
|
|
||||||
}
|
|
||||||
delete count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// assign NRMat = NRMat
|
|
||||||
template <typename T>
|
|
||||||
NRMat<T> & NRMat<T>::operator=(const NRMat<T> &rhs)
|
|
||||||
{
|
|
||||||
if (this == &rhs) return *this;
|
|
||||||
if (count) {
|
|
||||||
if (--(*count) ==0 ) {
|
|
||||||
#ifdef MATPTR
|
|
||||||
delete[] (v[0]);
|
|
||||||
#endif
|
|
||||||
delete[] v;
|
|
||||||
delete count;
|
|
||||||
}
|
|
||||||
v = rhs.v;
|
|
||||||
nn = rhs.nn;
|
|
||||||
mm = rhs.mm;
|
|
||||||
count = rhs.count;
|
|
||||||
if (count) (*count)--;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assign diagonal
|
// Assign diagonal
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -68,54 +32,7 @@ NRMat<T> & NRMat<T>::operator=(const T &a)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Explicit deep copy of NRmat
|
|
||||||
template <typename T>
|
|
||||||
NRMat<T> & NRMat<T>::operator|=(const NRMat<T> &rhs)
|
|
||||||
{
|
|
||||||
if (this == &rhs) return *this;
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (!rhs.v) laerror("unallocated rhs in Mat operator |=");
|
|
||||||
#endif
|
|
||||||
if (count)
|
|
||||||
if (*count > 1) {
|
|
||||||
--(*count);
|
|
||||||
nn = 0;
|
|
||||||
mm = 0;
|
|
||||||
count = 0;
|
|
||||||
v = 0;
|
|
||||||
}
|
|
||||||
if (nn != rhs.nn || mm != rhs.mm) {
|
|
||||||
if (v) {
|
|
||||||
#ifdef MATPTR
|
|
||||||
delete[] (v[0]);
|
|
||||||
#endif
|
|
||||||
delete[] (v);
|
|
||||||
v = 0;
|
|
||||||
}
|
|
||||||
nn = rhs.nn;
|
|
||||||
mm = rhs.mm;
|
|
||||||
}
|
|
||||||
if (!v) {
|
|
||||||
#ifdef MATPTR
|
|
||||||
v = new T*[nn];
|
|
||||||
v[0] = new T[mm*nn];
|
|
||||||
#else
|
|
||||||
v = new T[mm*nn];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MATPTR
|
|
||||||
for (int i=1; i< nn; i++) v[i] = v[i-1] + mm;
|
|
||||||
memcpy(v[0], rhs.v[0], nn*mm*sizeof(T));
|
|
||||||
#else
|
|
||||||
memcpy(v, rhs.v, nn*mm*sizeof(T));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!count) count = new int;
|
|
||||||
*count = 1;
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// M += a
|
// M += a
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -215,76 +132,7 @@ const NRVec<T> NRMat<T>::rsum() const
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// make detach Mat and make it's own deep copy
|
|
||||||
template <typename T>
|
|
||||||
void NRMat<T>::copyonwrite()
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (!count) laerror("Mat::copyonwrite of undefined matrix");
|
|
||||||
#endif
|
|
||||||
if (*count > 1) {
|
|
||||||
(*count)--;
|
|
||||||
count = new int;
|
|
||||||
*count = 1;
|
|
||||||
#ifdef MATPTR
|
|
||||||
T **newv = new T*[nn];
|
|
||||||
newv[0] = new T[mm*nn];
|
|
||||||
memcpy(newv[0], v[0], mm*nn*sizeof(T));
|
|
||||||
v = newv;
|
|
||||||
for (int i=1; i< nn; i++) v[i] = v[i-1] + mm;
|
|
||||||
#else
|
|
||||||
T *newv = new T[mm*nn];
|
|
||||||
memcpy(newv, v, mm*nn*sizeof(T));
|
|
||||||
v = newv;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void NRMat<T>::resize(const int n, const int m)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (n<=0 || m<=0) laerror("illegal dimensions in Mat::resize()");
|
|
||||||
#endif
|
|
||||||
if (count)
|
|
||||||
if (*count > 1) {
|
|
||||||
(*count)--;
|
|
||||||
count = 0;
|
|
||||||
v = 0;
|
|
||||||
nn = 0;
|
|
||||||
mm = 0;
|
|
||||||
}
|
|
||||||
if (!count) {
|
|
||||||
count = new int;
|
|
||||||
*count = 1;
|
|
||||||
nn = n;
|
|
||||||
mm = m;
|
|
||||||
#ifdef MATPTR
|
|
||||||
v = new T*[nn];
|
|
||||||
v[0] = new T[m*n];
|
|
||||||
for (int i=1; i< n; i++) v[i] = v[i-1] + m;
|
|
||||||
#else
|
|
||||||
v = new T[m*n];
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// At this point *count = 1, check if resize is necessary
|
|
||||||
if (n!=nn || m!=mm) {
|
|
||||||
nn = n;
|
|
||||||
mm = m;
|
|
||||||
#ifdef MATPTR
|
|
||||||
delete[] (v[0]);
|
|
||||||
#endif
|
|
||||||
delete[] v;
|
|
||||||
#ifdef MATPTR
|
|
||||||
v = new T*[nn];
|
|
||||||
v[0] = new T[m*n];
|
|
||||||
for (int i=1; i< n; i++) v[i] = v[i-1] + m;
|
|
||||||
#else
|
|
||||||
v = new T[m*n];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// transpose Mat
|
// transpose Mat
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
167
mat.h
167
mat.h
@ -327,6 +327,173 @@ inline const complex<double> NRMat< complex<double> >::amax() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//basi stuff to be available for any type ... must be in .h
|
||||||
|
// dtor
|
||||||
|
template <typename T>
|
||||||
|
NRMat<T>::~NRMat()
|
||||||
|
{
|
||||||
|
if (!count) return;
|
||||||
|
if (--(*count) <= 0) {
|
||||||
|
if (v) {
|
||||||
|
#ifdef MATPTR
|
||||||
|
delete[] (v[0]);
|
||||||
|
#endif
|
||||||
|
delete[] v;
|
||||||
|
}
|
||||||
|
delete count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// assign NRMat = NRMat
|
||||||
|
template <typename T>
|
||||||
|
NRMat<T> & NRMat<T>::operator=(const NRMat<T> &rhs)
|
||||||
|
{
|
||||||
|
if (this == &rhs) return *this;
|
||||||
|
if (count) {
|
||||||
|
if (--(*count) ==0 ) {
|
||||||
|
#ifdef MATPTR
|
||||||
|
delete[] (v[0]);
|
||||||
|
#endif
|
||||||
|
delete[] v;
|
||||||
|
delete count;
|
||||||
|
}
|
||||||
|
v = rhs.v;
|
||||||
|
nn = rhs.nn;
|
||||||
|
mm = rhs.mm;
|
||||||
|
count = rhs.count;
|
||||||
|
if (count) (*count)--;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Explicit deep copy of NRmat
|
||||||
|
template <typename T>
|
||||||
|
NRMat<T> & NRMat<T>::operator|=(const NRMat<T> &rhs)
|
||||||
|
{
|
||||||
|
if (this == &rhs) return *this;
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (!rhs.v) laerror("unallocated rhs in Mat operator |=");
|
||||||
|
#endif
|
||||||
|
if (count)
|
||||||
|
if (*count > 1) {
|
||||||
|
--(*count);
|
||||||
|
nn = 0;
|
||||||
|
mm = 0;
|
||||||
|
count = 0;
|
||||||
|
v = 0;
|
||||||
|
}
|
||||||
|
if (nn != rhs.nn || mm != rhs.mm) {
|
||||||
|
if (v) {
|
||||||
|
#ifdef MATPTR
|
||||||
|
delete[] (v[0]);
|
||||||
|
#endif
|
||||||
|
delete[] (v);
|
||||||
|
v = 0;
|
||||||
|
}
|
||||||
|
nn = rhs.nn;
|
||||||
|
mm = rhs.mm;
|
||||||
|
}
|
||||||
|
if (!v) {
|
||||||
|
#ifdef MATPTR
|
||||||
|
v = new T*[nn];
|
||||||
|
v[0] = new T[mm*nn];
|
||||||
|
#else
|
||||||
|
v = new T[mm*nn];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef MATPTR
|
||||||
|
for (int i=1; i< nn; i++) v[i] = v[i-1] + mm;
|
||||||
|
memcpy(v[0], rhs.v[0], nn*mm*sizeof(T));
|
||||||
|
#else
|
||||||
|
memcpy(v, rhs.v, nn*mm*sizeof(T));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!count) count = new int;
|
||||||
|
*count = 1;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make detach Mat and make it's own deep copy
|
||||||
|
template <typename T>
|
||||||
|
void NRMat<T>::copyonwrite()
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (!count) laerror("Mat::copyonwrite of undefined matrix");
|
||||||
|
#endif
|
||||||
|
if (*count > 1) {
|
||||||
|
(*count)--;
|
||||||
|
count = new int;
|
||||||
|
*count = 1;
|
||||||
|
#ifdef MATPTR
|
||||||
|
T **newv = new T*[nn];
|
||||||
|
newv[0] = new T[mm*nn];
|
||||||
|
memcpy(newv[0], v[0], mm*nn*sizeof(T));
|
||||||
|
v = newv;
|
||||||
|
for (int i=1; i< nn; i++) v[i] = v[i-1] + mm;
|
||||||
|
#else
|
||||||
|
T *newv = new T[mm*nn];
|
||||||
|
memcpy(newv, v, mm*nn*sizeof(T));
|
||||||
|
v = newv;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void NRMat<T>::resize(const int n, const int m)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (n<=0 || m<=0) laerror("illegal dimensions in Mat::resize()");
|
||||||
|
#endif
|
||||||
|
if (count)
|
||||||
|
if (*count > 1) {
|
||||||
|
(*count)--;
|
||||||
|
count = 0;
|
||||||
|
v = 0;
|
||||||
|
nn = 0;
|
||||||
|
mm = 0;
|
||||||
|
}
|
||||||
|
if (!count) {
|
||||||
|
count = new int;
|
||||||
|
*count = 1;
|
||||||
|
nn = n;
|
||||||
|
mm = m;
|
||||||
|
#ifdef MATPTR
|
||||||
|
v = new T*[nn];
|
||||||
|
v[0] = new T[m*n];
|
||||||
|
for (int i=1; i< n; i++) v[i] = v[i-1] + m;
|
||||||
|
#else
|
||||||
|
v = new T[m*n];
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// At this point *count = 1, check if resize is necessary
|
||||||
|
if (n!=nn || m!=mm) {
|
||||||
|
nn = n;
|
||||||
|
mm = m;
|
||||||
|
#ifdef MATPTR
|
||||||
|
delete[] (v[0]);
|
||||||
|
#endif
|
||||||
|
delete[] v;
|
||||||
|
#ifdef MATPTR
|
||||||
|
v = new T*[nn];
|
||||||
|
v[0] = new T[m*n];
|
||||||
|
for (int i=1; i< n; i++) v[i] = v[i-1] + m;
|
||||||
|
#else
|
||||||
|
v = new T[m*n];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// I/O
|
// I/O
|
||||||
template <typename T> extern ostream& operator<<(ostream &s, const NRMat<T> &x);
|
template <typename T> extern ostream& operator<<(ostream &s, const NRMat<T> &x);
|
||||||
template <typename T> extern istream& operator>>(istream &s, NRMat<T> &x);
|
template <typename T> extern istream& operator>>(istream &s, NRMat<T> &x);
|
||||||
|
12
nonclass.h
12
nonclass.h
@ -3,7 +3,17 @@
|
|||||||
#include "mat.h"
|
#include "mat.h"
|
||||||
|
|
||||||
//MISC
|
//MISC
|
||||||
template <class T> extern const NRMat<T> diagonalmatrix(const NRVec<T> &x);
|
export template <class T>
|
||||||
|
const NRMat<T> diagonalmatrix(const NRVec<T> &x)
|
||||||
|
{
|
||||||
|
int n=x.size();
|
||||||
|
NRMat<T> result((T)0,n,n);
|
||||||
|
T *p = result[0];
|
||||||
|
for(int j=0; j<n; j++) {*p = x[j]; p+=(n+1);}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//these just declared at the moment
|
||||||
template <class T> extern const NRVec<T> lineof(const NRMat<T> &x, const int i);
|
template <class T> extern const NRVec<T> lineof(const NRMat<T> &x, const int i);
|
||||||
template <class T> extern const NRVec<T> columnof(const NRMat<T> &x, const int i);
|
template <class T> extern const NRVec<T> columnof(const NRMat<T> &x, const int i);
|
||||||
template <class T> extern const NRVec<T> diagonalof(const NRMat<T> &x);
|
template <class T> extern const NRVec<T> diagonalof(const NRMat<T> &x);
|
||||||
|
96
smat.cc
96
smat.cc
@ -33,59 +33,6 @@ NRSMat<T>::NRSMat(const NRMat<T> &rhs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// dtor
|
|
||||||
template <typename T>
|
|
||||||
NRSMat<T>::~NRSMat()
|
|
||||||
{
|
|
||||||
if (!count) return;
|
|
||||||
if (--(*count) <= 0) {
|
|
||||||
if (v) delete[] (v);
|
|
||||||
delete count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// assignment with a physical copy
|
|
||||||
template <typename T>
|
|
||||||
NRSMat<T> & NRSMat<T>::operator|=(const NRSMat<T> &rhs)
|
|
||||||
{
|
|
||||||
if (this != &rhs) {
|
|
||||||
if(!rhs.v) laerror("unallocated rhs in NRSMat operator |=");
|
|
||||||
if(count)
|
|
||||||
if(*count > 1) { // detach from the other
|
|
||||||
--(*count);
|
|
||||||
nn = 0;
|
|
||||||
count = 0;
|
|
||||||
v = 0;
|
|
||||||
}
|
|
||||||
if (nn != rhs.nn) {
|
|
||||||
if(v) delete [] (v);
|
|
||||||
nn = rhs.nn;
|
|
||||||
}
|
|
||||||
if (!v) v = new T[NN2];
|
|
||||||
if (!count) count = new int;
|
|
||||||
*count = 1;
|
|
||||||
memcpy(v, rhs.v, NN2*sizeof(T));
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// assignment
|
|
||||||
template <typename T>
|
|
||||||
NRSMat<T> & NRSMat<T>::operator=(const NRSMat<T> & rhs)
|
|
||||||
{
|
|
||||||
if (this == & rhs) return *this;
|
|
||||||
if (count)
|
|
||||||
if(--(*count) == 0) {
|
|
||||||
delete [] v;
|
|
||||||
delete count;
|
|
||||||
}
|
|
||||||
v = rhs.v;
|
|
||||||
nn = rhs.nn;
|
|
||||||
count = rhs.count;
|
|
||||||
if (count) (*count)++;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// assing to diagonal
|
// assing to diagonal
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -114,50 +61,7 @@ const T NRSMat<T>::trace() const
|
|||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// make new instation of the Smat, deep copy
|
|
||||||
template <typename T>
|
|
||||||
void NRSMat<T>::copyonwrite()
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (!count) laerror("probably an assignment to undefined Smat");
|
|
||||||
#endif
|
|
||||||
if (*count > 1) {
|
|
||||||
(*count)--;
|
|
||||||
count = new int;
|
|
||||||
*count = 1;
|
|
||||||
T *newv = new T[NN2];
|
|
||||||
memcpy(newv, v, NN2*sizeof(T));
|
|
||||||
v = newv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// resize Smat
|
|
||||||
template <typename T>
|
|
||||||
void NRSMat<T>::resize(const int n)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (n <= 0) laerror("illegal matrix dimension in resize of Smat");
|
|
||||||
#endif
|
|
||||||
if (count)
|
|
||||||
if(*count > 1) { //detach from previous
|
|
||||||
(*count)--;
|
|
||||||
count = 0;
|
|
||||||
v = 0;
|
|
||||||
nn = 0;
|
|
||||||
}
|
|
||||||
if (!count) { //new uninitialized vector or just detached
|
|
||||||
count = new int;
|
|
||||||
*count = 1;
|
|
||||||
nn = n;
|
|
||||||
v = new T[NN2];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (n != nn) {
|
|
||||||
nn = n;
|
|
||||||
delete[] v;
|
|
||||||
v = new T[NN2];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// write matrix to the file with specific format
|
// write matrix to the file with specific format
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
105
smat.h
105
smat.h
@ -315,6 +315,111 @@ inline NRSMat<T>:: operator const T*() const
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//basic stuff to be available for any type ... must be in .h
|
||||||
|
|
||||||
|
// dtor
|
||||||
|
template <typename T>
|
||||||
|
NRSMat<T>::~NRSMat()
|
||||||
|
{
|
||||||
|
if (!count) return;
|
||||||
|
if (--(*count) <= 0) {
|
||||||
|
if (v) delete[] (v);
|
||||||
|
delete count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// assignment with a physical copy
|
||||||
|
template <typename T>
|
||||||
|
NRSMat<T> & NRSMat<T>::operator|=(const NRSMat<T> &rhs)
|
||||||
|
{
|
||||||
|
if (this != &rhs) {
|
||||||
|
if(!rhs.v) laerror("unallocated rhs in NRSMat operator |=");
|
||||||
|
if(count)
|
||||||
|
if(*count > 1) { // detach from the other
|
||||||
|
--(*count);
|
||||||
|
nn = 0;
|
||||||
|
count = 0;
|
||||||
|
v = 0;
|
||||||
|
}
|
||||||
|
if (nn != rhs.nn) {
|
||||||
|
if(v) delete [] (v);
|
||||||
|
nn = rhs.nn;
|
||||||
|
}
|
||||||
|
if (!v) v = new T[NN2];
|
||||||
|
if (!count) count = new int;
|
||||||
|
*count = 1;
|
||||||
|
memcpy(v, rhs.v, NN2*sizeof(T));
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// assignment
|
||||||
|
template <typename T>
|
||||||
|
NRSMat<T> & NRSMat<T>::operator=(const NRSMat<T> & rhs)
|
||||||
|
{
|
||||||
|
if (this == & rhs) return *this;
|
||||||
|
if (count)
|
||||||
|
if(--(*count) == 0) {
|
||||||
|
delete [] v;
|
||||||
|
delete count;
|
||||||
|
}
|
||||||
|
v = rhs.v;
|
||||||
|
nn = rhs.nn;
|
||||||
|
count = rhs.count;
|
||||||
|
if (count) (*count)++;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// make new instation of the Smat, deep copy
|
||||||
|
template <typename T>
|
||||||
|
void NRSMat<T>::copyonwrite()
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (!count) laerror("probably an assignment to undefined Smat");
|
||||||
|
#endif
|
||||||
|
if (*count > 1) {
|
||||||
|
(*count)--;
|
||||||
|
count = new int;
|
||||||
|
*count = 1;
|
||||||
|
T *newv = new T[NN2];
|
||||||
|
memcpy(newv, v, NN2*sizeof(T));
|
||||||
|
v = newv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// resize Smat
|
||||||
|
template <typename T>
|
||||||
|
void NRSMat<T>::resize(const int n)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (n <= 0) laerror("illegal matrix dimension in resize of Smat");
|
||||||
|
#endif
|
||||||
|
if (count)
|
||||||
|
if(*count > 1) { //detach from previous
|
||||||
|
(*count)--;
|
||||||
|
count = 0;
|
||||||
|
v = 0;
|
||||||
|
nn = 0;
|
||||||
|
}
|
||||||
|
if (!count) { //new uninitialized vector or just detached
|
||||||
|
count = new int;
|
||||||
|
*count = 1;
|
||||||
|
nn = n;
|
||||||
|
v = new T[NN2];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (n != nn) {
|
||||||
|
nn = n;
|
||||||
|
delete[] v;
|
||||||
|
v = new T[NN2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// I/O
|
// I/O
|
||||||
|
@ -197,11 +197,12 @@ r.gemm((T)1,y,tryy?'t':'n',x,trx?'t':'n',(T)1); //saves a temporary and simplifi
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//add sparse to dense
|
//add sparse to dense
|
||||||
template<class T>
|
template<class T>
|
||||||
NRMat<T> & NRMat<T>::operator+=(const SparseMat<T> &rhs)
|
NRMat<T> & NRMat<T>::operator+=(const SparseMat<T> &rhs)
|
||||||
{
|
{
|
||||||
if(nn!=rhs.nrows()||mm!=rhs.ncols()) laerror("incompatible matrices in +=");
|
if((unsigned int)nn!=rhs.nrows()||(unsigned int)mm!=rhs.ncols()) laerror("incompatible matrices in +=");
|
||||||
matel<T> *l=rhs.getlist();
|
matel<T> *l=rhs.getlist();
|
||||||
bool sym=rhs.issymmetric();
|
bool sym=rhs.issymmetric();
|
||||||
while(l)
|
while(l)
|
||||||
@ -215,6 +216,7 @@ while(l)
|
|||||||
#endif
|
#endif
|
||||||
l=l->next;
|
l=l->next;
|
||||||
}
|
}
|
||||||
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
5
t.cc
5
t.cc
@ -8,7 +8,8 @@
|
|||||||
#include "fourindex.h"
|
#include "fourindex.h"
|
||||||
|
|
||||||
|
|
||||||
extern void test(const NRVec<double> &);
|
extern void test(const NRVec<double> &x);
|
||||||
|
|
||||||
|
|
||||||
double ad;
|
double ad;
|
||||||
void f1(const double *c)
|
void f1(const double *c)
|
||||||
@ -40,6 +41,8 @@ NRVec<double> x(1.,10);
|
|||||||
NRVec<double> y(2.,10);
|
NRVec<double> y(2.,10);
|
||||||
NRVec<double> z(-2.,10);
|
NRVec<double> z(-2.,10);
|
||||||
|
|
||||||
|
if(0) test(x);
|
||||||
|
|
||||||
y.axpy(3,x);
|
y.axpy(3,x);
|
||||||
|
|
||||||
y+=z;
|
y+=z;
|
||||||
|
19
t2.cc
Normal file
19
t2.cc
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include "la.h"
|
||||||
|
#include "traceback.h"
|
||||||
|
#include "sparsemat.h"
|
||||||
|
#include "matexp.h"
|
||||||
|
#include "fourindex.h"
|
||||||
|
|
||||||
|
|
||||||
|
void test(const NRVec<double> &x)
|
||||||
|
{
|
||||||
|
NRMat<double> aa(0.,2,2);
|
||||||
|
NRMat<double> cc(aa);
|
||||||
|
cc.copyonwrite(); cc[0][0]=1.;
|
||||||
|
|
||||||
|
cout << aa << cc <<"\n";
|
||||||
|
cout <<"test x= "<<x<<"\n";
|
||||||
|
}
|
||||||
|
|
102
vec.cc
102
vec.cc
@ -33,83 +33,8 @@ NRVec<T>::NRVec(const NRMat<T> &rhs)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// dtor
|
|
||||||
template <typename T>
|
|
||||||
NRVec<T>::~NRVec()
|
|
||||||
{
|
|
||||||
if(!count) return;
|
|
||||||
if(--(*count) <= 0) {
|
|
||||||
if(v) delete[] (v);
|
|
||||||
delete count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// detach from a physical vector and make own copy
|
|
||||||
template <typename T>
|
|
||||||
void NRVec<T>::copyonwrite()
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
if(!count) laerror("probably an assignment to undefined vector");
|
|
||||||
#endif
|
|
||||||
if(*count > 1)
|
|
||||||
{
|
|
||||||
(*count)--;
|
|
||||||
count = new int;
|
|
||||||
*count = 1;
|
|
||||||
T *newv = new T[nn];
|
|
||||||
memcpy(newv, v, nn*sizeof(T));
|
|
||||||
v = newv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Asignment
|
|
||||||
template <typename T>
|
|
||||||
NRVec<T> & NRVec<T>::operator=(const NRVec<T> &rhs)
|
|
||||||
{
|
|
||||||
if (this != &rhs)
|
|
||||||
{
|
|
||||||
if(count)
|
|
||||||
if(--(*count) == 0)
|
|
||||||
{
|
|
||||||
delete[] v;
|
|
||||||
delete count;
|
|
||||||
}
|
|
||||||
v = rhs.v;
|
|
||||||
nn = rhs.nn;
|
|
||||||
count = rhs.count;
|
|
||||||
if(count) (*count)++;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resize
|
|
||||||
template <typename T>
|
|
||||||
void NRVec<T>::resize(const int n)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
if(n<=0) laerror("illegal vector dimension");
|
|
||||||
#endif
|
|
||||||
if(count)
|
|
||||||
if(*count > 1) {
|
|
||||||
(*count)--;
|
|
||||||
count = 0;
|
|
||||||
v = 0;
|
|
||||||
nn = 0;
|
|
||||||
}
|
|
||||||
if(!count) {
|
|
||||||
count = new int;
|
|
||||||
*count = 1;
|
|
||||||
nn = n;
|
|
||||||
v = new T[nn];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// *count = 1 in this branch
|
|
||||||
if (n != nn) {
|
|
||||||
nn = n;
|
|
||||||
delete[] v;
|
|
||||||
v = new T[nn];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ostream << NRVec
|
// ostream << NRVec
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -155,33 +80,6 @@ void NRVec<T>::fscanf(FILE *f, const char *format)
|
|||||||
laerror("cannot read the vector eleemnt");
|
laerror("cannot read the vector eleemnt");
|
||||||
}
|
}
|
||||||
|
|
||||||
// assignmet with a physical copy
|
|
||||||
template <typename T>
|
|
||||||
NRVec<T> & NRVec<T>::operator|=(const NRVec<T> &rhs)
|
|
||||||
{
|
|
||||||
if (this != &rhs) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (!rhs.v) laerror("unallocated rhs in NRVec operator |=");
|
|
||||||
#endif
|
|
||||||
if (count)
|
|
||||||
if (*count > 1) {
|
|
||||||
--(*count);
|
|
||||||
nn = 0;
|
|
||||||
count = 0;
|
|
||||||
v = 0;
|
|
||||||
}
|
|
||||||
if (nn != rhs.nn) {
|
|
||||||
if (v) delete[] (v);
|
|
||||||
nn = rhs.nn;
|
|
||||||
}
|
|
||||||
if(!v) v = new T[nn];
|
|
||||||
if(!count) count = new int;
|
|
||||||
*count = 1;
|
|
||||||
memcpy(v, rhs.v, nn*sizeof(T));
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// unary minus
|
// unary minus
|
||||||
template <typename T>
|
template <typename T>
|
||||||
const NRVec<T> NRVec<T>::operator-() const
|
const NRVec<T> NRVec<T>::operator-() const
|
||||||
|
111
vec.h
111
vec.h
@ -1,6 +1,8 @@
|
|||||||
#ifndef _LA_VEC_H_
|
#ifndef _LA_VEC_H_
|
||||||
#define _LA_VEC_H_
|
#define _LA_VEC_H_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "cblas.h"
|
#include "cblas.h"
|
||||||
}
|
}
|
||||||
@ -44,6 +46,7 @@ template<class T> \
|
|||||||
#include "smat.h"
|
#include "smat.h"
|
||||||
#include "mat.h"
|
#include "mat.h"
|
||||||
|
|
||||||
|
|
||||||
// NRVec class
|
// NRVec class
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class NRVec {
|
class NRVec {
|
||||||
@ -438,5 +441,113 @@ NRVECMAT_OPER2(Vec,-)
|
|||||||
|
|
||||||
// Few forward declarations
|
// Few forward declarations
|
||||||
|
|
||||||
|
//basic stuff which has to be in .h
|
||||||
|
// dtor
|
||||||
|
template <typename T>
|
||||||
|
NRVec<T>::~NRVec()
|
||||||
|
{
|
||||||
|
if(!count) return;
|
||||||
|
if(--(*count) <= 0) {
|
||||||
|
if(v) delete[] (v);
|
||||||
|
delete count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// detach from a physical vector and make own copy
|
||||||
|
template <typename T>
|
||||||
|
void NRVec<T>::copyonwrite()
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
if(!count) laerror("probably an assignment to undefined vector");
|
||||||
|
#endif
|
||||||
|
if(*count > 1)
|
||||||
|
{
|
||||||
|
(*count)--;
|
||||||
|
count = new int;
|
||||||
|
*count = 1;
|
||||||
|
T *newv = new T[nn];
|
||||||
|
memcpy(newv, v, nn*sizeof(T));
|
||||||
|
v = newv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Asignment
|
||||||
|
template <typename T>
|
||||||
|
NRVec<T> & NRVec<T>::operator=(const NRVec<T> &rhs)
|
||||||
|
{
|
||||||
|
if (this != &rhs)
|
||||||
|
{
|
||||||
|
if(count)
|
||||||
|
if(--(*count) == 0)
|
||||||
|
{
|
||||||
|
delete[] v;
|
||||||
|
delete count;
|
||||||
|
}
|
||||||
|
v = rhs.v;
|
||||||
|
nn = rhs.nn;
|
||||||
|
count = rhs.count;
|
||||||
|
if(count) (*count)++;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Resize
|
||||||
|
template <typename T>
|
||||||
|
void NRVec<T>::resize(const int n)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
if(n<=0) laerror("illegal vector dimension");
|
||||||
|
#endif
|
||||||
|
if(count)
|
||||||
|
if(*count > 1) {
|
||||||
|
(*count)--;
|
||||||
|
count = 0;
|
||||||
|
v = 0;
|
||||||
|
nn = 0;
|
||||||
|
}
|
||||||
|
if(!count) {
|
||||||
|
count = new int;
|
||||||
|
*count = 1;
|
||||||
|
nn = n;
|
||||||
|
v = new T[nn];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// *count = 1 in this branch
|
||||||
|
if (n != nn) {
|
||||||
|
nn = n;
|
||||||
|
delete[] v;
|
||||||
|
v = new T[nn];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// assignmet with a physical copy
|
||||||
|
template <typename T>
|
||||||
|
NRVec<T> & NRVec<T>::operator|=(const NRVec<T> &rhs)
|
||||||
|
{
|
||||||
|
if (this != &rhs) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (!rhs.v) laerror("unallocated rhs in NRVec operator |=");
|
||||||
|
#endif
|
||||||
|
if (count)
|
||||||
|
if (*count > 1) {
|
||||||
|
--(*count);
|
||||||
|
nn = 0;
|
||||||
|
count = 0;
|
||||||
|
v = 0;
|
||||||
|
}
|
||||||
|
if (nn != rhs.nn) {
|
||||||
|
if (v) delete[] (v);
|
||||||
|
nn = rhs.nn;
|
||||||
|
}
|
||||||
|
if(!v) v = new T[nn];
|
||||||
|
if(!count) count = new int;
|
||||||
|
*count = 1;
|
||||||
|
memcpy(v, rhs.v, nn*sizeof(T));
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _LA_VEC_H_ */
|
#endif /* _LA_VEC_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user