误差理论与测量平差课程设计实验报告讲解.docx
《误差理论与测量平差课程设计实验报告讲解.docx》由会员分享,可在线阅读,更多相关《误差理论与测量平差课程设计实验报告讲解.docx(46页珍藏版)》请在冰豆网上搜索。
误差理论与测量平差课程设计实验报告讲解
误差理论与测量平差
课程设计报告
●课程名称:
误差理论与测量平差
●课程题目:
平差计算器
●姓名:
江记洲
●专业:
测绘工程
●学号:
20104166
●学院:
土木与水利工程学院
●学校:
合肥工业大学
●指导老师:
陶庭叶
一、实验目的与要求
1)实验目的:
此次的课程设计可以用任何一种计算机语言来编写,这样给我们每个人很多的选择。
同时这样也是为了练习同学们对于一门语言的掌握和运用,大大的提高了我们的编程能力。
同时,通过对测量数据的误差处理,增强学生对《误差理论与测量平差基础》课程的理解,使学生牢固掌握测量数据处理的基本原理和公式,熟悉测量数据处理的基本技能和计算方法。
要求学生综合运用测绘知识、测量平差知识、数学知识和计算机知识,设计数学模型和程序算法,编制程序实现测量数据的自动化处理。
2)实验要求:
要求每位同学独立完成给定测量数据处理的数学模型和算法的设计,编写程序,调测程序,并编写程序设计文档。
要求数学模型和算法正确、程序运行正确、设计文档完备。
二、课程设计主要内容
课程设计的主要内容主要有:
1.新建一个基于单文档的MFC应用程序。
这只是基本的框架结构,里面包含了几个已知的类,在这些类的基础上,可以增加对象和变量。
然后是增加一个操作矩阵的类CMatrix的实现文件,Matrix.cpp和Matrix.h文件是从网上下载的,然后添加工程,创建了一个类,进行矩阵的计算。
通过运算符的重载,可以进行加减乘除计算,还可以进行矩阵的转置和求逆等运算。
现将该程序的Matrix.cpp文件附录如下:
//Matrix.cpp
#include"StdAfx.h"
#include"Matrix.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
//Construction/Destruction
//基本构造函数
CMatrix:
:
CMatrix()
{
m_nNumColumns=1;
m_nNumRows=1;
m_pData=NULL;
BOOLbSuccess=Init(m_nNumRows,m_nNumColumns);
ASSERT(bSuccess);
}
//指定行列构造函数
//参数:
//1.intnRows-指定的矩阵行数
//2.intnCols-指定的矩阵列数
CMatrix:
:
CMatrix(intnRows,intnCols)
{
m_nNumRows=nRows;
m_nNumColumns=nCols;
m_pData=NULL;
BOOLbSuccess=Init(m_nNumRows,m_nNumColumns);
ASSERT(bSuccess);
}
//初始化函数
//参数:
//1.intnRows-指定的矩阵行数
//2.intnCols-指定的矩阵列数
//
//返回值:
BOOL型,初始化是否成功
BOOLCMatrix:
:
Init(intnRows,intnCols)
{
if(m_pData)
{
delete[]m_pData;
m_pData=NULL;
}
m_nNumRows=nRows;
m_nNumColumns=nCols;
intnSize=nCols*nRows;
if(nSize<0)
returnFALSE;
//分配内存
m_pData=newdouble[nSize];
if(m_pData==NULL)
returnFALSE;//内存分配失败
if(IsBadReadPtr(m_pData,sizeof(double)*nSize))
returnFALSE;
//将各元素值置0
memset(m_pData,0,sizeof(double)*nSize);
returnTRUE;
}
//指定值构造函数
//参数:
//1.intnRows-指定的矩阵行数
//2.intnCols-指定的矩阵列数
//3.doublevalue[]-一维数组,长度为nRows*nCols,存储矩阵各元素的值
CMatrix:
:
CMatrix(intnRows,intnCols,doublevalue[])
{
m_nNumRows=nRows;
m_nNumColumns=nCols;
m_pData=NULL;
BOOLbSuccess=Init(m_nNumRows,m_nNumColumns);
ASSERT(bSuccess);
SetData(value);
}
//设置矩阵各元素的值
//参数:
//1.doublevalue[]-一维数组,长度为m_nNumColumns*m_nNumRows,存储
//矩阵各元素的值
//返回值:
无
voidCMatrix:
:
SetData(doublevalue[])
{
//emptythememory
memset(m_pData,0,sizeof(double)*m_nNumColumns*m_nNumRows);
//copydata
memcpy(m_pData,value,sizeof(double)*m_nNumColumns*m_nNumRows);
}
//方阵构造函数
//参数:
//1.intnSize-方阵行列数
CMatrix:
:
CMatrix(intnSize)
{
m_nNumRows=nSize;
m_nNumColumns=nSize;
m_pData=NULL;
BOOLbSuccess=Init(nSize,nSize);
ASSERT(bSuccess);
}
//方阵构造函数
//参数:
//1.intnSize-方阵行列数
//2.doublevalue[]-一维数组,长度为nRows*nRows,存储方阵各元素的值
CMatrix:
:
CMatrix(intnSize,doublevalue[])
{
m_nNumRows=nSize;
m_nNumColumns=nSize;
m_pData=NULL;
BOOLbSuccess=Init(nSize,nSize);
ASSERT(bSuccess);
SetData(value);
}
//拷贝构造函数
//参数:
//1.constCMatrix&other-源矩阵
CMatrix:
:
CMatrix(constCMatrix&other)
{
m_nNumColumns=other.GetNumColumns();
m_nNumRows=other.GetNumRows();
m_pData=NULL;
BOOLbSuccess=Init(m_nNumRows,m_nNumColumns);
ASSERT(bSuccess);
//copythepointer
memcpy(m_pData,other.m_pData,sizeof(double)*m_nNumColumns*m_nNumRows);
}
//析构函数
CMatrix:
:
~CMatrix()
{
if(m_pData)
{
delete[]m_pData;
m_pData=NULL;
}
}
//将方阵初始化为单位矩阵
//参数:
//1.intnSize-方阵行列数
//返回值:
BOOL型,初始化是否成功
BOOLCMatrix:
:
MakeUnitMatrix(intnSize)
{
if(!
Init(nSize,nSize))
returnFALSE;
for(inti=0;ifor(intj=0;jif(i==j)
SetElement(i,j,1);
returnTRUE;
}
//将字符串转化为矩阵的值
//参数:
//1.CStrings-数字和分隔符构成的字符串
//2.constCString&sDelim-数字之间的分隔符,默认为空格
//3.BOOLbLineBreak-行与行之间是否有回车换行符,默认为真(有换行符)
//当该参数为FALSE时,所有元素值都在一行中输入,字符串的第一个
//数值应为矩阵的行数,第二个数值应为矩阵的列数
//返回值:
BOOL型,转换是否成功
BOOLCMatrix:
:
FromString(CStrings,constCString&sDelim/*=""*/,BOOLbLineBreak/*=TRUE*/)
{
if(s.IsEmpty())
returnFALSE;
//分行处理
if(bLineBreak)
{
CTokenizertk(s,"\r\n");
CStringListListRow;
CStringsRow;
while(tk.Next(sRow))
{
sRow.TrimLeft();
sRow.TrimRight();
if(sRow.IsEmpty())
break;
ListRow.AddTail(sRow);
}
//行数
m_nNumRows=ListRow.GetCount();
sRow=ListRow.GetHead();
CTokenizertkRow(sRow,sDelim);
CStringsElement;
//列数
m_nNumColumns=0;
while(tkRow.Next(sElement))
{
m_nNumColumns++;
}
//初始化矩阵
if(!
Init(m_nNumRows,m_nNumColumns))
returnFALSE;
//设置值
POSITIONpos=ListRow.GetHeadPosition();
for(inti=0;i{
sRow=ListRow.GetNext(pos);
intj=0;
CTokenizertkRow(sRow,sDelim);
while(tkRow.Next(sElement))
{
sElement.TrimLeft();
sElement.TrimRight();
doublev=atof(sElement);
SetElement(i,j++,v);
}
}
returnTRUE;
}
//不分行(单行)处理
CTokenizertk(s,sDelim);
CStringsElement;
//行数
tk.Next(sElement);
sElement.TrimLeft();
sElement.TrimRight();
m_nNumRows=atoi(sElement);
//列数
tk.Next(sElement);
sElement.TrimLeft();
sElement.TrimRight();
m_nNumColumns=atoi(sElement);
//初始化矩阵
if(!
Init(m_nNumRows,m_nNumColumns))
returnFALSE;
//设置值
inti=0,j=0;
while(tk.Next(sElement))
{
sElement.TrimLeft();
sElement.TrimRight();
doublev=atof(sElement);
SetElement(i,j++,v);
if(j==m_nNumColumns)
{
j=0;
i++;
if(i==m_nNumRows)
break;
}
}
returnTRUE;
}
//将矩阵各元素的值转化为字符串
//
//参数:
//1.constCString&sDelim-数字之间的分隔符,默认为空格
//2BOOLbLineBreak-行与行之间是否有回车换行符,默认为真(有换行符)
//
//返回值:
CString型,转换得到的字符串
CStringCMatrix:
:
ToString(constCString&sDelim/*=""*/,BOOLbLineBreak/*=TRUE*/)const
{
CStrings="";
for(inti=0;i{
for(intj=0;j{
CStringss;
ss.Format("%f",GetElement(i,j));
s+=ss;
if(bLineBreak)
{
if(j!
=m_nNumColumns-1)
s+=sDelim;
}
else
{
if(i!
=m_nNumRows-1||j!
=m_nNumColumns-1)
s+=sDelim;
}
}
if(bLineBreak)
if(i!
=m_nNumRows-1)
s+="\r\n";
}
returns;
}
//将矩阵指定行中各元素的值转化为字符串
//参数:
//1.intnRow-指定的矩阵行,nRow=0表示第一行
//2.constCString&sDelim-数字之间的分隔符,默认为空格
//返回值:
CString型,转换得到的字符串
CStringCMatrix:
:
RowToString(intnRow,constCString&sDelim/*=""*/)const
{
CStrings="";
if(nRow>=m_nNumRows)
returns;
for(intj=0;j{
CStringss;
ss.Format("%f",GetElement(nRow,j));
s+=ss;
if(j!
=m_nNumColumns-1)
s+=sDelim;
}
returns;
}
//将矩阵指定列中各元素的值转化为字符串
//参数:
//1.intnCol-指定的矩阵行,nCol=0表示第一列
//2.constCString&sDelim-数字之间的分隔符,默认为空格
//返回值:
CString型,转换得到的字符串
CStringCMatrix:
:
ColToString(intnCol,constCString&sDelim/*=""*/)const
{
CStrings="";
if(nCol>=m_nNumColumns)
returns;
for(inti=0;i{
CStringss;
ss.Format("%f",GetElement(i,nCol));
s+=ss;
if(i!
=m_nNumRows-1)
s+=sDelim;
}
returns;
}
//设置指定元素的值
//参数:
//1.intnRows-指定的矩阵行数
//2.intnCols-指定的矩阵列数
//3.doublevalue-指定元素的值
//返回值:
BOOL型,说明设置是否成功
BOOLCMatrix:
:
SetElement(intnRow,intnCol,doublevalue)
{
if(nCol<0||nCol>=m_nNumColumns||nRow<0||nRow>=m_nNumRows)
returnFALSE;//arrayboundserror
if(m_pData==NULL)
returnFALSE;//badpointererror
m_pData[nCol+nRow*m_nNumColumns]=value;
returnTRUE;
}
//设置指定元素的值
//参数:
//1.intnRows-指定的矩阵行数
//2.intnCols-指定的矩阵列数
//返回值:
double型,指定元素的值
doubleCMatrix:
:
GetElement(intnRow,intnCol)const
{
ASSERT(nCol>=0&&nCol=0&&nRowASSERT(m_pData);//badpointererror
returnm_pData[nCol+nRow*m_nNumColumns];
}
//获取矩阵的列数
//参数:
无
//返回值:
int型,矩阵的列数
intCMatrix:
:
GetNumColumns()const
{
returnm_nNumColumns;
}
//获取矩阵的行数
//参数:
无
//返回值:
int型,矩阵的行数
intCMatrix:
:
GetNumRows()const
{
returnm_nNumRows;
}
//获取矩阵的数据
//参数:
无
//返回值:
double型指针,指向矩阵各元素的数据缓冲区
double*CMatrix:
:
GetData()const
{
returnm_pData;
}
//获取指定行的向量
//参数:
//1.intnRows-指定的矩阵行数
//2.double*pVector-指向向量中各元素的缓冲区
//返回值:
int型,向量中元素的个数,即矩阵的列数
intCMatrix:
:
GetRowVector(intnRow,double*pVector)const
{
if(pVector==NULL)
deletepVector;
pVector=newdouble[m_nNumColumns];
ASSERT(pVector!
=NULL);
for(intj=0;jpVector[j]=GetElement(nRow,j);
returnm_nNumColumns;
}
//获取指定列的向量
//参数:
//1.intnCols-指定的矩阵列数
//2.double*pVector-指向向量中各元素的缓冲区
//返回值:
int型,向量中元素的个数,即矩阵的行数
intCMatrix:
:
GetColVector(intnCol,double*pVector)const
{
if(pVector==NULL)
deletepVector;
pVector=newdouble[m_nNumRows];
ASSERT(pVector!
=NULL);
for(inti=0;ipVector[i]=GetElement(i,nCol);
returnm_nNumRows;
}
//重载运算符=,给矩阵赋值
//参数:
//1.constCMatrix&other-用于给矩阵赋值的源矩阵
//返回值:
CMatrix型的引用,所引用的矩阵与other相等
CMatrix&CMatrix:
:
operator=(constCMatrix&other)
{
if(&other!
=this)
{
BOOLbSuccess=Init(other.GetNumRows(),other.GetNumColumns());
ASSERT(bSuccess);
//copythepointer
memcpy(m_pData,other.m_pData,sizeof(double)*m_nNumColumns*m_nNumRows);
}
//finallyreturnareferencetoourselves
return*this;
}
//重载运算符==,判断矩阵是否相等
//参数:
//1.constCMatrix&other-用于比较的矩阵
//返回值:
BOOL型,两个矩阵相等则为TRUE,否则为FALSE
BOOLCMatrix:
:
operator==(constCMatrix&other)const
{
//首先检查行列数是否相等
if(m_nNumColumns!
=other.GetNumColumns()||m_nNumRows!
=other.GetNumRows())
returnFALSE;
for(inti=0;i{
for(intj=0;j