C#数值计算算法编程矩阵类Matrix的设计.doc_第1页
C#数值计算算法编程矩阵类Matrix的设计.doc_第2页
C#数值计算算法编程矩阵类Matrix的设计.doc_第3页
C#数值计算算法编程矩阵类Matrix的设计.doc_第4页
C#数值计算算法编程矩阵类Matrix的设计.doc_第5页
免费预览已结束,剩余63页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#数值计算算法编程矩阵类Matrix的设计namespace CSharpAlgorithm.Algorithm/* 操作矩阵的类Matrix* author 周长发* version 1.0*/public class Matrix private intnumColumns = 0;/ 矩阵列数private intnumRows = 0;/ 矩阵行数private double eps = 0.0;/ 缺省精度private double elements = null;/ 矩阵数据缓冲区/* * 属性: 矩阵列数 */public int Columnsgetreturn numColumns;/* * 属性: 矩阵行数 */public int Rowsgetreturn numRows;/* * 索引器: 访问矩阵元素 * param row - 元素的行 * param col - 元素的列 */public double thisint row, int colgetreturn elementscol + row * numColumns; setelementscol + row * numColumns = value;/* * 属性: Eps */public double Epsgetreturn eps;seteps = value;/* * 基本构造函数 */public Matrix()numColumns = 1;numRows = 1;Init(numRows, numColumns);/* * 指定行列构造函数 * * param nRows - 指定的矩阵行数 * param nCols - 指定的矩阵列数 */public Matrix(int nRows, int nCols)numRows = nRows;numColumns = nCols;Init(numRows, numColumns);/* * 指定值构造函数 * * param value - 二维数组,存储矩阵各元素的值 */public Matrix(double, value)numRows = value.GetLength(0);numColumns = value.GetLength(1);double data = new doublenumRows * numColumns;int k = 0;for (int i=0; inumRows; +i)for (int j=0; jnumColumns; +j)datak+ = valuei, j; Init(numRows, numColumns);SetData(data);/* * 指定值构造函数 * * param nRows - 指定的矩阵行数 * param nCols - 指定的矩阵列数 * param value - 一维数组,长度为nRows*nCols,存储矩阵各元素的值 */public Matrix(int nRows, int nCols, double value)numRows = nRows;numColumns = nCols;Init(numRows, numColumns);SetData(value);/* * 方阵构造函数 * * param nSize - 方阵行列数 */public Matrix(int nSize)numRows = nSize;numColumns = nSize;Init(nSize, nSize);/* * 方阵构造函数 * * param nSize - 方阵行列数 * param value - 一维数组,长度为nRows*nRows,存储方阵各元素的值 */public Matrix(int nSize, double value)numRows = nSize;numColumns = nSize;Init(nSize, nSize);SetData(value);/* * 拷贝构造函数 * * param other - 源矩阵 */public Matrix( Matrix other)numColumns = other.GetNumColumns();numRows = other.GetNumRows();Init(numRows, numColumns);SetData(other.elements);/* * 初始化函数 * * param nRows - 指定的矩阵行数 * param nCols - 指定的矩阵列数 * return bool, 成功返回true, 否则返回false */public bool Init(int nRows, int nCols)numRows = nRows;numColumns = nCols;int nSize = nCols*nRows;if (nSize 0)return false;/ 分配内存elements = new doublenSize;return true;/* * 设置矩阵运算的精度 * * param newEps - 新的精度值 */public void SetEps(double newEps)eps = newEps;/* * 取矩阵的精度值 * * return double型,矩阵的精度值 */public double GetEps()return eps;/* * 重载+ 运算符 * * return Matrix对象 */public static Matrix operator +(Matrix m1, Matrix m2)return m1.Add(m2);/* * 重载- 运算符 * * return Matrix对象 */public static Matrix operator -(Matrix m1, Matrix m2)return m1.Subtract(m2);/* * 重载* 运算符 * * return Matrix对象 */public static Matrix operator *(Matrix m1, Matrix m2)return m1.Multiply(m2);/* * 重载double 运算符 * * return double对象 */public static implicit operator double(Matrix m)return m.elements;/* * 将方阵初始化为单位矩阵 * * param nSize - 方阵行列数 * return bool 型,初始化是否成功 */public bool MakeUnitMatrix(int nSize)if (! Init(nSize, nSize)return false;for (int i=0; inSize; +i)for (int j=0; jnSize; +j)if (i = j)SetElement(i, j, 1);return true;/* * 将矩阵各元素的值转化为字符串, 元素之间的分隔符为, 行与行之间有回车换行符 * return string 型,转换得到的字符串 */public override string ToString() return ToString(, true);/* * 将矩阵各元素的值转化为字符串 * * param sDelim - 元素之间的分隔符 * param bLineBreak - 行与行之间是否有回车换行符 * return string 型,转换得到的字符串 */public string ToString(string sDelim, bool bLineBreak) string s=;for (int i=0; inumRows; +i)for (int j=0; j= numRows)return s;for (int j=0; j= numColumns)return s;for (int i=0; inumRows; +i)string ss = GetElement(i, nCol).ToString(F);s += ss;if (i != numRows-1)s += sDelim;return s;/* * 设置矩阵各元素的值 * * param value - 一维数组,长度为numColumns*numRows,存储 * 矩阵各元素的值 */public void SetData(double value)elements = (double)value.Clone();/* * 设置指定元素的值 * * param nRow - 元素的行 * param nCol - 元素的列 * param value - 指定元素的值 * return bool 型,说明设置是否成功 */public bool SetElement(int nRow, int nCol, double value)if (nCol = numColumns | nRow = numRows)return false;/ array bounds errorelementsnCol + nRow * numColumns = value;return true;/* * 获取指定元素的值 * * param nRow - 元素的行 * param nCol - 元素的列 * return double 型,指定元素的值 */public double GetElement(int nRow, int nCol) return elementsnCol + nRow * numColumns ;/* * 获取矩阵的列数 * * return int 型,矩阵的列数 */public intGetNumColumns() return numColumns;/* * 获取矩阵的行数 * return int 型,矩阵的行数 */public intGetNumRows() return numRows;/* * 获取矩阵的数据 * * return double型数组,指向矩阵各元素的数据缓冲区 */public double GetData() return elements;/* * 获取指定行的向量 * * param nRow - 向量所在的行 * param pVector - 指向向量中各元素的缓冲区 * return int 型,向量中元素的个数,即矩阵的列数 */public int GetRowVector(int nRow, double pVector) for (int j=0; jnumColumns; +j)pVectorj = GetElement(nRow, j);return numColumns;/* * 获取指定列的向量 * * param nCol - 向量所在的列 * param pVector - 指向向量中各元素的缓冲区 * return int 型,向量中元素的个数,即矩阵的行数 */public int GetColVector(int nCol, double pVector) for (int i=0; inumRows; +i)pVectori = GetElement(i, nCol);return numRows;/* * 给矩阵赋值 * * param other - 用于给矩阵赋值的源矩阵 * return Matrix型,阵与other相等 */public Matrix SetValue(Matrix other)if (other != this)Init(other.GetNumRows(), other.GetNumColumns();SetData(other.elements);/ finally return a reference to ourselvesreturn this ;/* * 判断矩阵否相等 * * param other - 用于比较的矩阵 * return bool 型,两个矩阵相等则为true,否则为false */public override bool Equals(object other) Matrix matrix = other as Matrix;if (matrix = null)return false;/ 首先检查行列数是否相等if (numColumns != matrix.GetNumColumns() | numRows != matrix.GetNumRows()return false;for (int i=0; inumRows; +i)for (int j=0; j eps)return false;return true;/* * 因为重写了Equals,因此必须重写GetHashCode * * return int型,返回复数对象散列码 */public override int GetHashCode()double sum = 0;for (int i=0; inumRows; +i)for (int j=0; jnumColumns; +j)sum += Math.Abs(GetElement(i, j);return (int)Math.Sqrt(sum);/* * 实现矩阵的加法 * * param other - 与指定矩阵相加的矩阵 * return Matrix型,指定矩阵与other相加之和 * 如果矩阵的行/列数不匹配,则会抛出异常 */public Matrix Add(Matrix other) / 首先检查行列数是否相等if (numColumns != other.GetNumColumns() |numRows != other.GetNumRows()throw new Exception(矩阵的行/列数不匹配。);/ 构造结果矩阵Matrixresult = new Matrix(this) ;/ 拷贝构造/ 矩阵加法for (int i = 0 ; i numRows ; +i)for (int j = 0 ; j numColumns; +j)result.SetElement(i, j, result.GetElement(i, j) + other.GetElement(i, j) ;return result ;/* * 实现矩阵的减法 * * param other - 与指定矩阵相减的矩阵 * return Matrix型,指定矩阵与other相减之差 * 如果矩阵的行/列数不匹配,则会抛出异常 */public Matrix Subtract(Matrix other) if (numColumns != other.GetNumColumns() |numRows != other.GetNumRows()throw new Exception(矩阵的行/列数不匹配。);/ 构造结果矩阵Matrixresult = new Matrix(this) ;/ 拷贝构造/ 进行减法操作for (int i = 0 ; i numRows ; +i)for (int j = 0 ; j numColumns; +j)result.SetElement(i, j, result.GetElement(i, j) - other.GetElement(i, j) ;return result ;/* * 实现矩阵的数乘 * * param value - 与指定矩阵相乘的实数 * return Matrix型,指定矩阵与value相乘之积 */public Matrix Multiply(double value) / 构造目标矩阵Matrixresult = new Matrix(this) ;/ copy ourselves/ 进行数乘for (int i = 0 ; i numRows ; +i)for (int j = 0 ; j numColumns; +j)result.SetElement(i, j, result.GetElement(i, j) * value) ;return result ;/* * 实现矩阵的乘法 * * param other - 与指定矩阵相乘的矩阵 * return Matrix型,指定矩阵与other相乘之积 * 如果矩阵的行/列数不匹配,则会抛出异常 */public Matrix Multiply(Matrix other) / 首先检查行列数是否符合要求if (numColumns != other.GetNumRows()throw new Exception(矩阵的行/列数不匹配。);/ ruct the object we are going to returnMatrixresult = new Matrix(numRows, other.GetNumColumns();/ 矩阵乘法,即/ ABC GH A*G + B*I + C*KA*H + B*J + C*L/ DEF * IJ = D*G + E*I + F*KD*H + E*J + F*L/ KL/doublevalue ;for (int i = 0 ; i result.GetNumRows() ; +i)for (int j = 0 ; j other.GetNumColumns() ; +j)value = 0.0 ;for (int k = 0 ; k numColumns ; +k)value += GetElement(i, k) * other.GetElement(k, j) ;result.SetElement(i, j, value) ;return result ;/* * 复矩阵的乘法 * * param AR - 左边复矩阵的实部矩阵 * param AI - 左边复矩阵的虚部矩阵 * param BR - 右边复矩阵的实部矩阵 * param BI - 右边复矩阵的虚部矩阵 * param CR - 乘积复矩阵的实部矩阵 * param CI - 乘积复矩阵的虚部矩阵 * return bool型,复矩阵乘法是否成功 */public bool Multiply(Matrix AR, Matrix AI, Matrix BR, Matrix BI, Matrix CR, Matrix CI) / 首先检查行列数是否符合要求if (AR.GetNumColumns() != AI.GetNumColumns() |AR.GetNumRows() != AI.GetNumRows() |BR.GetNumColumns() != BI.GetNumColumns() |BR.GetNumRows() != BI.GetNumRows() |AR.GetNumColumns() != BR.GetNumRows()return false;/ 构造乘积矩阵实部矩阵和虚部矩阵Matrix mtxCR = new Matrix(AR.GetNumRows(), BR.GetNumColumns();Matrix mtxCI = new Matrix(AR.GetNumRows(), BR.GetNumColumns();/ 复矩阵相乘for (int i=0; iAR.GetNumRows(); +i)for (int j=0; jBR.GetNumColumns(); +j)double vr = 0;double vi = 0;for (int k =0; kAR.GetNumColumns(); +k)double p = AR.GetElement(i, k) * BR.GetElement(k, j);double q = AI.GetElement(i, k) * BI.GetElement(k, j);double s = (AR.GetElement(i, k) + AI.GetElement(i, k) * (BR.GetElement(k, j) + BI.GetElement(k, j);vr += p - q;vi += s - p - q;mtxCR.SetElement(i, j, vr);mtxCI.SetElement(i, j, vi);CR = mtxCR;CI = mtxCI;return true;/* * 矩阵的转置 * * return Matrix型,指定矩阵转置矩阵 */public Matrix Transpose() / 构造目标矩阵MatrixTrans = new Matrix(numColumns, numRows);/ 转置各元素for (int i = 0 ; i numRows ; +i)for (int j = 0 ; j numColumns ; +j)Trans.SetElement(j, i, GetElement(i, j) ;return Trans;/* * 实矩阵求逆的全选主元高斯约当法 * * return bool型,求逆是否成功 */public bool InvertGaussJordan()int i,j,k,l,u,v;double d = 0, p = 0;/ 分配内存int pnRow = new intnumColumns;int pnCol = new intnumColumns;/ 消元for (k=0; k=numColumns-1; k+) d=0.0;for (i=k; i=numColumns-1; i+)for (j=k; jd) d=p; pnRowk=i; pnColk=j; / 失败if (d = 0.0)return false;if (pnRowk != k)for (j=0; j=numColumns-1; j+) u=k*numColumns+j; v=pnRowk*numColumns+j;p=elementsu; elementsu=elementsv; elementsv=p; if (pnColk != k)for (i=0; i=numColumns-1; i+) u=i*numColumns+k; v=i*numColumns+pnColk;p=elementsu; elementsu=elementsv; elementsv=p;l=k*numColumns+k;elementsl=1.0/elementsl;for (j=0; j=numColumns-1; j+)if (j != k) u=k*numColumns+j; elementsu=elementsu*elementsl;for (i=0; i=numColumns-1; i+)if (i!=k)for (j=0; j=numColumns-1; j+)if (j!=k) u=i*numColumns+j;elementsu=elementsu-elementsi*numColumns+k*elementsk*numColumns+j;for (i=0; i=0; k-) if (pnColk!=k)for (j=0; j=numColumns-1; j+) u=k*numColumns+j; v=pnColk*numColumns+j;p=elementsu; elementsu=elementsv; elementsv=p;if (pnRowk!=k)for (i=0; i=numColumns-1; i+) u=i*numColumns+k; v=i*numColumns+pnRowk;p=elementsu; elementsu=elementsv; elementsv=p;/ 成功返回return true;/* * 复矩阵求逆的全选主元高斯约当法 * * param mtxImag - 复矩阵的虚部矩阵,当前矩阵为复矩阵的实部 * return bool型,求逆是否成功 */public bool InvertGaussJordan(Matrix mtxImag)int i,j,k,l,u,v,w;double p,q,s,t,d,b;/ 分配内存int pnRow = new intnumColumns;int pnCol = new intnumColumns;/ 消元for (k=0; k=numColumns-1; k+) d=0.0;for (i=k; i=numColumns-1; i+)for (j=k; jd) d=p; pnRowk=i; pnColk=j;/ 失败if (d = 0.0) return false;if (pnRowk!=k)for (j=0; j=numColumns-1; j+) u=k*numColumns+j; v=pnRowk*numColumns+j;t=elementsu; elementsu=elementsv; elementsv=t;t=mtxImag.elementsu; mtxImag.elementsu=mtxImag.elementsv; mtxImag.elementsv=t;if (pnColk!=k)for (i=0; i=numColumns-1; i+) u=i*numColumns+k; v=i*numColumns+pnColk;t=elementsu; elementsu=elementsv; elementsv=t;t=mtxImag.elementsu; mtxImag.elementsu=mtxImag.elementsv; mtxImag.elementsv=t;l=k*numColumns+k;elementsl=elementsl/d; mtxImag.elementsl=-mtxImag.elementsl/d;for (j=0; j=numColumns-1; j+)if (j!=k) u=k*numColumns+j;p=elementsu*elementsl; q=mtxImag.elementsu*mtxImag.elementsl;s=(elementsu+mtxImag.elementsu)*(elementsl+mtxImag.elementsl);elementsu=p-q; mtxImag.elementsu=s-p-q;for (i=0; i=numColumns-1; i+)if (i!=k) v=i*n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论