误差理论与测量平差课程设计实验报告讲解.docx
- 文档编号:2588970
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:46
- 大小:1.12MB
误差理论与测量平差课程设计实验报告讲解.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;i for(intj=0;j if(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 ASSERT(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;j pVector[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;i pVector[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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 误差 理论 测量 课程设计 实验 报告 讲解