📄 apvt.h
字号:
return;
}
}
/********************************************************************
vmove, another form
********************************************************************/
template<class T, class T2>
void _vmove(T *vdst, const T *vsrc, int N, T2 alpha)
{
T *p1 = vdst;
const T *p2 = vsrc;
int imax = N/4;
int i;
for(i=imax; i!=0; i--)
{
*p1 = alpha*(*p2);
p1[1] = alpha*p2[1];
p1[2] = alpha*p2[2];
p1[3] = alpha*p2[3];
p1 += 4;
p2 += 4;
}
for(i=0; i<N%4; i++)
*(p1++) = alpha*(*(p2++));
}
/********************************************************************
Vector addition
********************************************************************/
template<class T>
void vadd(raw_vector<T> vdst, const_raw_vector<T> vsrc)
{
ap_error::make_assertion(vdst.GetLength()==vsrc.GetLength());
if( vdst.GetStep()==1 && vsrc.GetStep()==1 )
{
//
// fast
//
T *p1 = vdst.GetData();
const T *p2 = vsrc.GetData();
int imax = vdst.GetLength()/4;
int i;
for(i=imax; i!=0; i--)
{
*p1 += *p2;
p1[1] += p2[1];
p1[2] += p2[2];
p1[3] += p2[3];
p1 += 4;
p2 += 4;
}
for(i=0; i<vdst.GetLength()%4; i++)
*(p1++) += *(p2++);
return;
}
else
{
//
// general
//
int offset11 = vdst.GetStep(), offset12 = 2*offset11, offset13 = 3*offset11, offset14 = 4*offset11;
int offset21 = vsrc.GetStep(), offset22 = 2*offset21, offset23 = 3*offset21, offset24 = 4*offset21;
T *p1 = vdst.GetData();
const T *p2 = vsrc.GetData();
int imax = vdst.GetLength()/4;
int i;
for(i=0; i<imax; i++)
{
*p1 += *p2;
p1[offset11] += p2[offset21];
p1[offset12] += p2[offset22];
p1[offset13] += p2[offset23];
p1 += offset14;
p2 += offset24;
}
for(i=0; i<vdst.GetLength()%4; i++)
{
*p1 += *p2;
p1 += vdst.GetStep();
p2 += vsrc.GetStep();
}
return;
}
}
/********************************************************************
vadd, another form
********************************************************************/
template<class T>
void _vadd(T *vdst, const T *vsrc, int N)
{
T *p1 = vdst;
const T *p2 = vsrc;
int imax = N/4;
int i;
for(i=imax; i!=0; i--)
{
*p1 += *p2;
p1[1] += p2[1];
p1[2] += p2[2];
p1[3] += p2[3];
p1 += 4;
p2 += 4;
}
for(i=0; i<N%4; i++)
*(p1++) += *(p2++);
}
/********************************************************************
Add one vector multiplied by a number to another vector.
********************************************************************/
template<class T, class T2>
void vadd(raw_vector<T> vdst, const_raw_vector<T> vsrc, T2 alpha)
{
ap_error::make_assertion(vdst.GetLength()==vsrc.GetLength());
if( vdst.GetStep()==1 && vsrc.GetStep()==1 )
{
//
// fast
//
T *p1 = vdst.GetData();
const T *p2 = vsrc.GetData();
int imax = vdst.GetLength()/4;
int i;
for(i=imax; i!=0; i--)
{
*p1 += alpha*(*p2);
p1[1] += alpha*p2[1];
p1[2] += alpha*p2[2];
p1[3] += alpha*p2[3];
p1 += 4;
p2 += 4;
}
for(i=0; i<vdst.GetLength()%4; i++)
*(p1++) += alpha*(*(p2++));
return;
}
else
{
//
// general
//
int offset11 = vdst.GetStep(), offset12 = 2*offset11, offset13 = 3*offset11, offset14 = 4*offset11;
int offset21 = vsrc.GetStep(), offset22 = 2*offset21, offset23 = 3*offset21, offset24 = 4*offset21;
T *p1 = vdst.GetData();
const T *p2 = vsrc.GetData();
int imax = vdst.GetLength()/4;
int i;
for(i=0; i<imax; i++)
{
*p1 += alpha*(*p2);
p1[offset11] += alpha*p2[offset21];
p1[offset12] += alpha*p2[offset22];
p1[offset13] += alpha*p2[offset23];
p1 += offset14;
p2 += offset24;
}
for(i=0; i<vdst.GetLength()%4; i++)
{
*p1 += alpha*(*p2);
p1 += vdst.GetStep();
p2 += vsrc.GetStep();
}
return;
}
}
/********************************************************************
vadd, another form
********************************************************************/
template<class T, class T2>
void _vadd(T *vdst, const T *vsrc, int N, T2 alpha)
{
T *p1 = vdst;
const T *p2 = vsrc;
int imax = N/4;
int i;
for(i=imax; i!=0; i--)
{
*p1 += alpha*(*p2);
p1[1] += alpha*p2[1];
p1[2] += alpha*p2[2];
p1[3] += alpha*p2[3];
p1 += 4;
p2 += 4;
}
for(i=0; i<N%4; i++)
*(p1++) += alpha*(*(p2++));
}
/********************************************************************
Vector subtraction
********************************************************************/
template<class T>
void vsub(raw_vector<T> vdst, const_raw_vector<T> vsrc)
{
ap_error::make_assertion(vdst.GetLength()==vsrc.GetLength());
if( vdst.GetStep()==1 && vsrc.GetStep()==1 )
{
//
// fast
//
T *p1 = vdst.GetData();
const T *p2 = vsrc.GetData();
int imax = vdst.GetLength()/4;
int i;
for(i=imax; i!=0; i--)
{
*p1 -= *p2;
p1[1] -= p2[1];
p1[2] -= p2[2];
p1[3] -= p2[3];
p1 += 4;
p2 += 4;
}
for(i=0; i<vdst.GetLength()%4; i++)
*(p1++) -= *(p2++);
return;
}
else
{
//
// general
//
int offset11 = vdst.GetStep(), offset12 = 2*offset11, offset13 = 3*offset11, offset14 = 4*offset11;
int offset21 = vsrc.GetStep(), offset22 = 2*offset21, offset23 = 3*offset21, offset24 = 4*offset21;
T *p1 = vdst.GetData();
const T *p2 = vsrc.GetData();
int imax = vdst.GetLength()/4;
int i;
for(i=0; i<imax; i++)
{
*p1 -= *p2;
p1[offset11] -= p2[offset21];
p1[offset12] -= p2[offset22];
p1[offset13] -= p2[offset23];
p1 += offset14;
p2 += offset24;
}
for(i=0; i<vdst.GetLength()%4; i++)
{
*p1 -= *p2;
p1 += vdst.GetStep();
p2 += vsrc.GetStep();
}
return;
}
}
/********************************************************************
vsub, another form
********************************************************************/
template<class T>
void _vsub(T *vdst, const T *vsrc, int N)
{
T *p1 = vdst;
const T *p2 = vsrc;
int imax = N/4;
int i;
for(i=imax; i!=0; i--)
{
*p1 -= *p2;
p1[1] -= p2[1];
p1[2] -= p2[2];
p1[3] -= p2[3];
p1 += 4;
p2 += 4;
}
for(i=0; i<N%4; i++)
*(p1++) -= *(p2++);
}
/********************************************************************
Subtract one vector multiplied by a number from another vector.
********************************************************************/
template<class T, class T2>
void vsub(raw_vector<T> vdst, const_raw_vector<T> vsrc, T2 alpha)
{
vadd(vdst, vsrc, -alpha);
}
/********************************************************************
vsub, another form
********************************************************************/
template<class T, class T2>
void _vsub(T *vdst, const T *vsrc, int N, T2 alpha)
{
vadd(vdst, vsrc, N, -alpha);
}
/********************************************************************
In-place vector multiplication
********************************************************************/
template<class T, class T2>
void vmul(raw_vector<T> vdst, T2 alpha)
{
if( vdst.GetStep()==1 )
{
//
// fast
//
T *p1 = vdst.GetData();
int imax = vdst.GetLength()/4;
int i;
for(i=imax; i!=0; i--)
{
*p1 *= alpha;
p1[1] *= alpha;
p1[2] *= alpha;
p1[3] *= alpha;
p1 += 4;
}
for(i=0; i<vdst.GetLength()%4; i++)
*(p1++) *= alpha;
return;
}
else
{
//
// general
//
int offset11 = vdst.GetStep(), offset12 = 2*offset11, offset13 = 3*offset11, offset14 = 4*offset11;
T *p1 = vdst.GetData();
int imax = vdst.GetLength()/4;
int i;
for(i=0; i<imax; i++)
{
*p1 *= alpha;
p1[offset11] *= alpha;
p1[offset12] *= alpha;
p1[offset13] *= alpha;
p1 += offset14;
}
for(i=0; i<vdst.GetLength()%4; i++)
{
*p1 *= alpha;
p1 += vdst.GetStep();
}
return;
}
}
/********************************************************************
vmul, another form
********************************************************************/
template<class T, class T2>
void _vmul(T *vdst, int N, T2 alpha)
{
T *p1 = vdst;
int imax = N/4;
int i;
for(i=imax; i!=0; i--)
{
*p1 *= alpha;
p1[1] *= alpha;
p1[2] *= alpha;
p1[3] *= alpha;
p1 += 4;
}
for(i=0; i<N%4; i++)
*(p1++) *= alpha;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -