6#ifndef _TNMMTR_H_INCLUDED_
7#define _TNMMTR_H_INCLUDED_
43 int m_height,m_width,m_size,m_stride,m_border;
46 nmmtr(
int Height,
int Width,
int Border=0):m_height(Height), m_width(Width)
49 m_container=
new T[(m_height+2*m_border)*m_width];
50 m_data=m_container+m_width*m_border;
53 m_size=m_width*m_height;
55 ASSERTE(m_data!=NULL);
67 inline nmvec<T> operator [](
int y)
const
69 ASSERTE(y>=-m_border);
70 ASSERTE(y<m_height+m_border);
71 return nmvec<T>(m_data+y*m_stride,m_width);
78 m_height=
mtr.m_height;
80 m_border=
mtr.m_border;
82 m_container=
new T[(m_height+2*m_border)*m_width];
83 m_data=m_container+m_width*m_border;
87 for(
int y=0; y<m_height; y++)
88 memcpy(m_data+y*m_stride,
mtr.m_data+y*
mtr.m_stride,m_width*
sizeof(T));
91 nmmtr(T* Data,
int Height,
int Width,
int Stride=0):m_height(Height), m_width(Width), m_data(Data),m_stride(Stride),m_border(0)
95 m_size =m_height*m_width;
99 nmmtr(
const T* Data,
int Height,
int Width,
int Stride=0):m_height(Height), m_width(Width), m_data((T*)Data),m_stride(Stride),m_border(0)
103 m_size =m_height*m_width;
116 ASSERTE(
mtr.m_height==m_height);
117 ASSERTE(
mtr.m_width ==m_width);
118 for(
int y=0; y<m_height; y++)
123 nmmtr<T>& operator*= (
const nmint<T>& val)
126 for(
int y=0; y< m_height; y++,pData+=m_stride)
127 for(
int x=0; x<m_width; x++)
128 pData[x]*=val.m_value;
132 template <
class T2>
nmmtr<T2> operator* (
const nmint<T2>& val)
135 T* pResData=mRes.m_data;
137 for(
int y=0; y< m_height; y++,pResData+=m_stride,pData+=m_stride)
138 for(
int x=0; x<m_width; x++)
139 pResData[x]=pData[x]*val.m_value;
143 template <
class T2> nmvec<T2> operator* (
const nmvec<T2>&
vec)
145 ASSERTE(m_width==
vec.m_size);
146 nmvec<T2> vRes(m_height);
148 for(
int y=0;y<m_height;y++,pData+=m_stride)
151 for(
int x=0; x<m_width; x++)
152 nSum+=pData[x]*
vec.m_data[x];
160 ASSERTE(m_width==
mtr.m_height);
162 for(
int y=0; y<mRes.m_height; y++)
163 for(
int x=0; x<mRes.m_width; x++)
166 for(
int i=0;i<m_width;i++)
167 sum+=m_data[m_stride*y+i]*
mtr.m_data[
mtr.m_stride*i+x];
168 mRes.m_data[y*mRes.m_stride+x]=sum;
173 nmvec<T>& operator+= (
const nmint<T> &val)
176 for(
int y=0; y< m_height; y++,pData+=m_stride)
177 for(
int x=0; x<m_width; x++)
178 pData[x]+=val.m_value;
184 ASSERTE (
mtr.m_size==m_size);
186 T* pParData =
mtr.m_data;
188 for(
int y=0; y< m_height; y++,pParData+=
mtr.m_stride,pData+=m_stride)
189 for(
int x=0; x<m_width; x++)
190 pData[x]+=pParData[x];
197 ASSERTE (
mtr.m_size==m_size);
205 ASSERTE (
mtr.m_size==m_size);
206 T* pParData =
mtr.m_data;
208 for(
int y=0; y< m_height; y++,pParData+=
mtr.m_stride,pData+=m_stride)
209 for(
int x=0; x<m_width; x++)
210 pData[x]-=pParData[x];
216 ASSERTE (
mtr.m_size==m_size);
217 nmmtr <T> res(*
this);
225 T* pResData =mRes.m_data;
227 for(
int y=0; y< m_height; y++, pResData+=mRes.m_stride, pData+=m_stride)
228 for(
int x=0; x<m_width; x++)
229 pResData[x]=-pData[x];
237 for(
int y=0; y<m_height; y++, pData+=m_stride)
238 for(
int x=0; x<m_width; x++)
244 nmmtr<T> operator/ (
const nmint<T> val)
const
251 nmmtr<T>& operator>>=(
const int shr)
257 for(
int y=0; y<m_height; y++, pData+=m_stride)
258 for(
int x=0; x<m_width; x++)
263 nmmtr<T> operator>> (
const int shr)
const
271 nmmtr<T>& operator<<=(
const int shl)
277 for(
int y=0; y<m_height; y++, pData+=m_stride)
278 for(
int x=0; x<m_width; x++)
283 nmmtr<T> operator<< (
const int shl)
const
293 ASSERTE (
mtr.m_size==m_size);
294 T* pParData =
mtr.m_data;
296 for(
int y=0; y< m_height; y++,pParData+=
mtr.m_stride,pData+=m_stride)
297 for(
int x=0; x<m_width; x++)
298 pData[x]|=pParData[x];
304 ASSERTE (
mtr.m_size==m_size);
305 nmmtr <T> res(*
this);
312 ASSERTE (
mtr.m_size==m_size);
313 T* pParData =
mtr.m_data;
315 for(
int y=0; y< m_height; y++,pParData+=
mtr.m_stride,pData+=m_stride)
316 for(
int x=0; x<m_width; x++)
317 pData[x]&=pParData[x];
323 ASSERTE (
mtr.m_size==m_size);
329 nmmtr<T>& operator^= (
const nmint<T> &val)
332 for(
int y=0; y< m_height; y++,pData+=m_stride)
333 for(
int x=0; x<m_width; x++)
334 pData[x]^=val.m_value;
338 nmmtr<T> operator^ (
const nmint<T>& val)
const
348 T* pResData =res.m_data;
350 for(
int y=0; y< m_height; y++,pResData+=res.m_stride,pData+=m_stride)
351 for(
int x=0; x<m_width; x++)
352 pResData[x]=~pData[x];
358 inline T* addr(
int y,
int x)
360 return m_data+y*m_stride+x;
364 inline nmvec<T>
vec(
int y)
366 return nmvec<T>(m_data+y*m_stride,m_width,m_border);
369void fill(nmint<T> &nVal)
372 for(
int y=0; y< m_height; y++, pData+=m_stride)
373 for(
int x=0; x<m_width; x++)
374 pData[x]=nVal.m_value;;
380 for(
int y=0;y<m_height;y++)
381 for(
int x=0;x<m_width;x++)
382 Z[x][y]=(*
this)[y][x];
386 template<
class T2>
void set(
nmmtr<T2>& mSrcMtr)
const
388 T* pSrcData=mSrcMtr.m_data;
390 for(
int y=0; y< m_height; y++, pDstData+=m_stride, pSrcData+=mSrcMtr.m_stride)
391 for(
int x=0; x<m_width; x++)
392 *pDstData[x]=pSrcData[x];
395 template<
class T2>
void set(
mtr<T2> &Mtr)
398 for(
int y=0; y< m_height; y++, pData+=m_stride)
399 for(
int x=0; x<m_width; x++)
403 void set(
const T val)
405 for(
int y=0; y< m_height; y++)
411 if (m_width==m_stride)
414 memset(m_container,0,m_stride*(m_height+m_border*2)*
sizeof(T));
416 memset(m_data,0,m_stride*m_height*
sizeof(T));
421 for(
int y=0;y<m_width;y++,p+=m_stride)
422 memset(p,0,m_width*
sizeof(T));
519 for(
int y=0; y< mSrcMtr1.m_height; y++)
520 for(
int x=0; x<mSrcMtr1.m_width; x++)
522 nmint<T2> res=mSrcMtr1[y][x]*mSrcMtr2[y][x];
527 template<
class T1,
class T2>
void GetSum(
nmmtr<T1>& mSrcMtr1, nmint<T2>& nResSum)
530 for(
int y=0; y< mSrcMtr1.m_height; y++)
531 for(
int x=0; x<mSrcMtr1.m_width; x++)
532 nResSum+=nmint<T2> (mSrcMtr1[y][x].m_value);