📄 cvector.cpp
字号:
// CVector.cpp: implementation of the CVector class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CVector.h"
#include <math.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CVector::CVector()
{
//在执行本函数体之前,要执行基类CMatrix的默认构造函数CMatrix()
}
//初始化
CVector::CVector(const CMatrix& OriginalMatrix)
{
//在执行本函数体之前,要执行基类CMatrix的默认构造函数CMatrix()
InitMatrix(OriginalMatrix.GetDataAddress(), OriginalMatrix.GetRowNumber(), 1);
}
//初始化
CVector::CVector(const CVector& OriginalVector)
{
//在执行本函数体之前,要执行基类CMatrix的默认构造函数CMatrix()
InitMatrix(OriginalVector.GetDataAddress(), OriginalVector.GetRowNumber(), 1);
}
/*功能:初始化
//参数:
pData 数据地址
nElementNum 矢量数组长*/
CVector::CVector(const f8 *pData, i4 nElementNum)
{
InitMatrix(pData,nElementNum,1);
}
/*功能:初始化
//参数:
pData 数据地址
nElementNum 矢量数组长*/
i4 CVector::InitVector(const f8 *pData, i4 nElementNum)
{
return InitMatrix(pData,nElementNum,1);
}
CVector::~CVector()
{
}
//////////////////////////////////////////////////////////////////////////
// Implementations
//////////////////////////////////////////////////////////////////////
//功能:矢量叉积
//参数:veRight 被叉积的矢量
//返回:矢量叉积结果矢量
CVector CVector::VectorMulti(const CVector &veRight)
{
CMatrix maAntisym = this->GetAntisymmetricMatrix();
CVector veResult = maAntisym * veRight;
return veResult;
}
//功能:矢量点积
//参数:veRight 被点积的矢量
//返回:矢量点积结果标量
f8 CVector::ScalarMulti(const CVector &veRight)
{
CMatrix maMultiResult = this->GetTransposedMatrix() * veRight;//在C++语言中,派生类对象可以当作基类对象直接使用,不必进行转换
f8 dData; maMultiResult.GetData(&dData);
return dData;
}
//功能:计算三维向量相对应的反对称矩阵
//参数:无
//返回:三维反对称矩阵
CMatrix CVector::GetAntisymmetricMatrix()
{
CMatrix maAntisym;
if(this->m_nRowNumber != 3) return maAntisym;
f8 pdAntisym[9] = { 0, - *(m_pData+2), *(m_pData+1),
*(m_pData+2), 0, - *(m_pData+0),
- *(m_pData+1), *(m_pData+0), 0 };
maAntisym.InitMatrix(pdAntisym,3,3);
return maAntisym;
}
//功能:获取矢量子量
//参数:
// vePart: 矢量部分结果
// nStart: 开始位置,从0起算
// nLength: 子向量长度
//返回:成功1;失败0
i4 CVector::GetSubVector(CVector& vePart, i4 nStart, i4 nLength)const
{
if(nLength == 0 || nLength>m_nRowNumber) return 0;
vePart.InitVector(m_pData+nStart, nLength);
return 1;
}
//功能:获取矢量子量
//参数:
// nStart: 开始位置,从0起算
// nLength: 子向量长度
//返回:矢量部分结果
CVector CVector::GetSubVector(i4 nStart, i4 nLength)const
{
CVector veRes;
this->GetSubVector(veRes, nStart, nLength);
return veRes;
}
//功能:获取矢量长度
//参数:无
//返回:矢量长度
f8 CVector::GetLength()
{
f8 f8Length = 0;
for (i4 i=0; i<m_nRowNumber; i++)
{
f8Length += m_pData[i] * m_pData[i];
}
f8Length = sqrt(f8Length);
return f8Length;
}
f8 CVector::GetLength(i4 n)
{
if (n > m_nRowNumber)
return -1.0;
f8 f8Length = 0;
for (i4 i=0; i<n; i++)
{
f8Length += m_pData[i] * m_pData[i];
}
f8Length = sqrt(f8Length);
return f8Length;
}
//功能:赋值操作符重载
/*参数:SecMatrix: 源矩阵,也可以是向量
返回值:自身矢量的引用,这样可以使用连等形式,如: A = B = C ,此时 A , B 都等于 C 的值;
实现方法:调用InitMatrix()函数实现功能
使用示例:A=B=C 意为: B=C; A=B; */
CVector& CVector::operator= (const CMatrix & SecMatrix)
{
if(&SecMatrix == this) return *this;
this->InitMatrix(SecMatrix.GetDataAddress(),SecMatrix.GetRowNumber(),1);
return *this;
}
//[] overloading
f8 CVector::operator [](const i4 pos)const
{
ASSERT(pos>=0 && pos < m_nRowNumber);
return *(m_pData+ pos);
}
//- overloading
// CVector CVector::operator- (const f8 array[])const
// {
// CVector SecTmpVec;
// SecTmpVec.InitVector(array,m_nRowNumber);
// return (*this-SecTmpVec);
// }
//
// //- overloading
// CVector CVector::operator- (const CMatrix matrix)const
// {
// ASSERT(matrix.GetColumnNumber() ==1);
// ASSERT(matrix.GetRowNumber() ==m_nRowNumber);
// CVector tmpVec;
//
// return tmpVec;
// }
//print to file
i4 CVector::PrintFile(FILE& fp)
{
for (i4 row=0;row<m_nRowNumber;row++)
{
f8 data=*(m_pData+ row);
if ((fabs(data)>0.001 && data <1e7 && data >-1e7) || fabs(data) <1e-10)
fprintf(&fp,"%12.3f,",data);
else if(data<-1e7)
{
//modify the index digit to 2;
int decimal, sign; //decimal point position and sign.
char *buffer; //store string
char csign;
int precision = 3; //Number of digits stored
buffer = _ecvt( data, precision, &decimal, &sign );
sign == 0 ?csign=' ':csign='-';
fprintf(&fp,"%c%c.%se%d,",csign,buffer[0],buffer+1,decimal-1);
}
else if(data>1e7)
{
//modify the index digit to 2;
int decimal, sign; //decimal point position and sign.
char *buffer; //store string
char csign;
int precision = 4; //Number of digits stored
buffer = _ecvt( data, precision, &decimal, &sign );
sign == 0 ?csign=' ':csign='-';
fprintf(&fp," %c%c.%se%d,",csign,buffer[0],buffer+1,decimal-1);
}
else
{
//modify the index digit to 2;
int decimal, sign; //decimal point position and sign.
char *buffer; //store string
char csign;
int precision = 4; //Number of digits stored
buffer = _ecvt( data, precision, &decimal, &sign );
sign == 0 ?csign=' ':csign='-';
decimal<0 ? fprintf(&fp,"%c%c.%se%d,",csign,buffer[0],buffer+1,decimal-1):
fprintf(&fp," %c%c.%se%d,",csign,buffer[0],buffer+1,decimal-1);
}
}
fprintf(&fp,"\n");
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -