6#ifndef _TMATRIX_H_INCLUDED_
7#define _TMATRIX_H_INCLUDED_
87template<
class T>
class mtr
94 int m_height,m_width,m_size;
110 void origin(
int y,
int x){
116 inline void setval(
int y,
int x,
const T& val)
118 ASSERTE(y>=-m_border);
119 ASSERTE(y<m_height+m_border);
120 m_data[y*m_stride+x]=val;
124 inline void setvalx(
int y,
int x,
const T& val)
126 ASSERTE(y+m_y0>=-m_border);
127 ASSERTE(y+m_y0<m_height+m_border);
128 m_data[(y+m_y0)*m_stride+x+m_x0]=val;
131 inline T getval(
int y,
int x)
const
133 ASSERTE(y>=-m_border);
134 ASSERTE(y<m_height+m_border);
135 T val=m_data[y*m_stride+x];
139 inline T getvalx(
int y,
int x)
const
141 ASSERTE(y+m_y0>=-m_border);
142 ASSERTE(y+m_y0<m_height+m_border);
143 T val=m_data[(y+m_y0)*m_stride+x+m_x0];
148 explicit mtr(
int nHeight,
int nWidth,
int nBorder=0)
154 m_size=m_width*m_height;
155 m_container=
new T[m_size+2*m_stride*m_border];
156 m_data=m_container+m_border*m_stride;
157 ASSERTE(m_container!=NULL);
161 void resize(
int nHeight,
int nWidth,
int nBorder=0)
168 m_size =m_width*m_height;
170 m_container=
new T[m_size+2*m_stride*m_border];
171 m_data=m_container+m_border*m_stride;
177 m_height=matr.m_height;
178 m_width =matr.m_width;
181 m_border=matr.m_border;
182 m_container =
new T[m_size+2*m_stride*m_border];
183 m_data=m_container+m_border*m_stride;
185 for(
int y=0;y<m_height;y++){
186 for(
int x=0;x<m_width;x++){
187 T val=matr.getval(y,x);
216 void assign(T* Data,
int nHeight,
int nWidth,
int nStride=0){
223 m_size =m_height*m_width;
228 explicit mtr(T* Data,
int nHeight,
int nWidth,
int nStride=0)
230 assign(Data,nHeight,nWidth,nStride);
244 ASSERTE(matr.m_height==m_height);
245 ASSERTE(matr.m_width ==m_width);
246 T* pSrcData=matr.m_data;
248 for(
int y=0;y<m_height;y++,pSrcData+=matr.m_stride, pDstData+=m_stride)
249 for(
int x=0; x<m_width; x++)
250 pDstData[x]=pSrcData[x];
255 mtr<T>& operator= (T& val)
257 for(
int y=0;y<m_height;y++)
270 inline T* operator[](
int row)
const
272 ASSERTE(row<m_height+m_border);
273 ASSERTE(row>=-m_border);
274 return m_data+row*m_stride;
278 inline T& index(
int idx)
282 ASSERTE(m_width==m_stride);
294 mtr<T>& operator*= (
const T val)
296 for(
int y=0;y<m_height;y++)
302 mtr<T> operator* (
const T& val)
const
311 ASSERTE(m_width==vect.m_size);
313 for(
int y=0;y<m_height;y++)
314 res[y]=getvec(y)*vect;
336 ASSERTE(m_width==matr.m_height);
337 mtr<T> res(m_height, matr.m_width);
339 for(
int y=0;y<m_height;y++)
341 vec<T>& thisvec=getvec(y);
342 vec<T>& resvec=res.getvec(y);
343 for(
int x=0;x<m_width;x++)
344 resvec+=matr.getvec(x)*thisvec[x];
350 mtr<T>& operator+= (
const T &val)
352 for(
int y=0;y<m_height;y++)
360 ASSERTE (matr.m_size==m_size);
361 for(
int y=0;y<m_height;y++)
362 getvec(y)+=matr.getvec(y);
369 ASSERTE (matr.m_size==m_size);
378 ASSERTE (matr.m_size==m_size);
379 for(
int y=0;y<m_height;y++)
380 getvec(y)-=matr.getvec(y);
385 mtr<T>& operator-= (
const T &val)
387 for(
int y=0;y<m_height;y++)
395 ASSERTE (matr.m_size==m_size);
404 mtr<T> res(m_height,m_width);
405 for(
int y=0;y<m_height;y++)
406 res.getvec(y)=-getvec(y);
411 mtr<T>& operator/=(
const T val)
414 for(
int y=0;y<m_height;y++)
420 mtr<T> operator/ (
const T val)
const
428 mtr<T>& operator>>=(
const int shr)
431 for(
int y=0;y<m_height;y++)
437 mtr<T> operator>> (
const int shr)
const
446 mtr<T>& operator<<=(
const int shl)
449 for(
int y=0; y<m_height; y++)
455 mtr<T> operator<< (
const int shl)
const
464 mtr<T>& operator&= (
const T &val)
466 for(
int y=0;y<m_height;y++)
475 ASSERTE (matr.m_size==m_size);
476 for(
int y=0;y<m_height;y++)
477 getvec(y)&=matr.getvec(y);
484 ASSERTE (matr.m_size==m_size);
493 ASSERTE (matr.m_size==m_size);
494 for(
int y=0;y<m_height;y++)
495 getvec(y)|=matr.getvec(y);
502 ASSERTE (matr.m_size==m_size);
511 ASSERTE (matr.m_size==m_size);
512 for(
int y=0;y<m_height;y++)
513 getvec(y)^=matr.getvec(y);
518 mtr<T>& operator^= (
const T &val)
520 for(
int y=0;y<m_height;y++)
528 ASSERTE (matr.m_size==m_size);
535 mtr<T> operator^ (
const T& val)
const
548 for(
int y=0;y<m_height;y++, r+=res.m_stride, s+=m_stride)
549 for(
int x=0; x<m_width;x++)
557 void set (
const T val)
560 for(
int y=0; y<m_height; y++,p+=m_stride){
561 for(
int x=0; x<m_width; x++){
640 mtr<T> Z(m_width,m_height);
641 for(
int row=0;row<m_height;row++)
642 for(
int col=0;col<m_width;col++)
643 Z[col][row]=(*
this)[row][col];
650 int size=(m_height<m_width)?(m_height):(m_width);
651 for(
int i=0; i<size; i++)
667 inline T* addr(
int y,
int x)
669 ASSERTE(y<m_height+m_border);
670 ASSERTE(y>=-m_border);
671 ASSERTE(x<m_width+m_border);
672 ASSERTE(x>=-m_border);
673 T* address=m_data+m_stride*y+x;
681 memset(m_container,0,(m_size+2*m_border*m_width)*
sizeof(T));
683 memset(m_data,0,m_size*
sizeof(T));
690 for(
int y=0;y<m_height;y++)
693 summ+=getvec(y).sum();
699 vec<T> getvec(
int y)
const
701 ASSERTE(y>=0 && y<m_height);
702 return vec<T>(m_data+y*m_stride,m_width,m_border);
705 vec<T> getcol(
int x)
const
707 ASSERTE(x>=0 && x<m_width);
709 for(
int i=0; i<m_height; i++)
710 vect[i]=(*
this)[i][x];
738 T minpos(
int &ypos,
int &xpos){
743 for(
int y=0; y<m_height; y++, row+=m_stride)
744 for(
int x=0; x<m_width; x++)
753 T maxpos(
int &ypos,
int &xpos){
758 for(
int y=0; y<m_height; y++, row+=m_stride)
759 for(
int x=0; x<m_width; x++)
768 void CopyTo(T* pData){
770 for(
int y=0; y<m_height; y++, row+=m_stride, pData+=m_width){
771 memcpy(pData, row,
sizeof(T)*m_width);
775 void CopyFrom(T* pData){
777 for(
int y=0; y<m_height; y++, row+=m_stride, pData+=m_width){
778 memcpy(row, pData,
sizeof(T)*m_width);
782 template <
class T2>
void ConvertTo(T2* pData){
784 for(
int y=0; y<m_height; y++, row+=m_stride, pData+=m_width){
785 for(
int x=0; x<m_width; x++){
791 template <
class T2>
void ConvertFrom(T2* pData){
793 for(
int y=0; y<m_height; y++, row+=m_stride, pData+=m_width){
794 for(
int x=0; x<m_width; x++){
828 mtr<T> res(vSrc1.m_size, vSrc2.m_size);
829 for(
int y=0; y<res.m_height; y++){
830 res.getvec(y)=vSrc2*vSrc1[y];
841 for(
int y=0; y< mSrcMtr1.m_height; y++)
842 for(
int x=0; x<mSrcMtr1.m_width; x++)
844 T2 res=mSrcMtr1[y][x]*mSrcMtr2[y][x];
849 template<
class T1,
class T2>
void GetSum(
mtr<T1>& mSrcMtr1, T2& nResSum)
852 for(
int y=0; y< mSrcMtr1.m_height; y++)
853 for(
int x=0; x<mSrcMtr1.m_width; x++)
854 nResSum+=T2 (mSrcMtr1[y][x]);
856 template<
class T1,
class T2>
void Convert(
mtr<T1>& mSrcMtr,
mtr<T2>& mDstMtr){
857 ASSERTE(mSrcMtr.m_height==mDstMtr.m_height);
858 ASSERTE(mSrcMtr.m_width ==mDstMtr.m_width);
859 for(
int y=0; y<mSrcMtr.m_height; y++){
860 for(
int x=0; x<mSrcMtr.m_width; x++){
861 mDstMtr[y][x]=(T2)mSrcMtr[y][x];