#ifndef HRTMATRIX_H #define HRTMATRIX_H #include class HRtVector; class HRtFloatMemoryBlock { private: Double_t *fData; Int_t fReferences; public: HRtFloatMemoryBlock(Int_t size) {fData = new Double_t[size]; fReferences=1;} ~HRtFloatMemoryBlock(void) { delete[] fData; fData = 0;} void reference(void) { fReferences++; } void unReference(void) { fReferences--; if (fReferences==0) delete this;} Double_t &at(Int_t i) { return fData[i]; } void set(Int_t i,Double_t j) { fData[i] = j; } }; class HRtMatrix { private: HRtFloatMemoryBlock *fData; Int_t fSizes[2]; //Rows and Columns Int_t fStride[2]; //Strides for each dimension public: inline HRtMatrix(Int_t rows,Int_t cols); inline HRtMatrix(const HRtMatrix &m); inline ~HRtMatrix(void); inline Double_t &operator()(Int_t i,Int_t j); inline HRtMatrix &operator=(HRtMatrix &a); inline HRtMatrix transpose(void); inline void transposeSelf(void); inline void multiply(HRtMatrix &a,HRtMatrix &b); inline HRtMatrix &operator*=(HRtMatrix &b); Int_t getRows(void) { return fSizes[0]; } Int_t getCols(void) { return fSizes[1]; } inline Double_t convolute(HRtVector &v); inline void identity(void); inline void print(const Text_t name[]=""); }; inline void HRtMatrix::identity(void) { HRtMatrix &a=*this; for (Int_t i=0;iunReference(); fData = new HRtFloatMemoryBlock(entries); for (Int_t i=0; iset(i,m.fData->at(i)); return m; } inline void HRtMatrix::multiply(HRtMatrix &a,HRtMatrix &b) { HRtMatrix &r=*this; Double_t sum; for (Int_t i=0; iat(i*fStride[0]+j*fStride[1]); } inline HRtMatrix HRtMatrix::transpose(void) { HRtMatrix r(*this); r.transposeSelf(); return r; } inline void HRtMatrix::transposeSelf(void) { Int_t temp = fStride[0]; fStride[0] = fStride[1]; fStride[1] = temp; temp = fSizes[0]; fSizes[0] = fSizes[1]; fSizes[1] = temp; } inline HRtMatrix::HRtMatrix(const HRtMatrix &m) { fSizes[0] = m.fSizes[0]; fSizes[1] = m.fSizes[1]; fStride[0] = m.fStride[0]; fStride[1] = m.fStride[1]; fData = m.fData; fData->reference(); } inline HRtMatrix::HRtMatrix(Int_t rows,Int_t cols) { fSizes[0] = rows; fSizes[1] = cols; fStride[0] = cols; fStride[1] = 1; fData = new HRtFloatMemoryBlock(fSizes[0] * fSizes[1]); } inline HRtMatrix::~HRtMatrix(void) { fData->unReference(); } inline void HRtMatrix::print(const Text_t name[]) { HRtMatrix &a=*this; printf("\nMatrix %s is:",name); printf("\n |"); for (Int_t j=0;j