matrix类
简要描述:
matrix类顾名思义也就是矩阵类,它主要用于支持项目中用到的与矩阵相关的运算,采用包含头文件得方式引用。
使用方法:
1.将该类所属的三个文件:matrix.h,matrix.cpp,mymath.h拷贝到用户主
程序所在目录下;
2.在用户要调用的文件头写下:#include “matrix.h”
3.在用户想要定义矩阵的地方写下如下语句:
matrix A,B(2,2),C(3,4,’R’),D(4,2,’C’),E(1,10,’L’)
这样就定义了五个矩阵对象;
4.在定义得对象后按照C++标准的引用方式就可以使用矩阵类的所用功能;
(祥见功能列表)
5.释放矩阵空间,例如:A.ReleaseSpace()。
成员变量列表:
函数名称 函数代码标志 属性 描述
矩阵行 int row private 矩阵特性,函数获取
矩阵列 int column private 矩阵特性,函数获取
实矩阵指针 double mat_ad private 实矩阵数据存放首地址
复矩阵指针 ComplexNum
atcplx_ad
private
复矩阵数据存放
首地址
字符矩阵指针 char ch_ad private 字符矩阵数据存放首地址
功能列表:
变量名称 变量代码标志 描述
构造函数1 matrix()无形参情况下,初始化矩阵对象
构造函数2 matrix(int m,int n)双输入时默认创建实矩阵
构造函数3 matrix(int m,int n,char p)按照指定类型大小创建矩阵
析构函数 ~matrix()对象消失时相关操作
获取行函数 int GetRow()从外部获取私有变量row
获取列函数 int GetColumn()从外部获取私有变量column
获取实矩阵指针函数 double * GetMat()若矩阵为实矩阵,获取实矩阵首地址,其他时候返回NULL
获取复矩阵指针函数 ComplexNum
*GetMatCplx()
若矩阵为复矩阵,获取复
矩阵首地址,其他时候返
回NULL
获取字符矩阵指针函数 char *GetMatChar()若矩阵为字符矩阵,获取字符矩阵首地址,其他时候返回NULL
矩阵创建函数 void CreatMat(int m,int
n,char p)
在任意位置,创建一个指
定类型大小的矩阵
矩阵行设置行数 void SetColumn(int m)在任意位置重新指定矩阵的行数
矩阵列设置函数 void SetRow(int n)在任意位置重新指定矩阵的列数
设置实指针函数void SetDataAD(double
*p)
在任意位置重新指定矩
阵实指针指向
设置复指针函数 Void
SetDataAD(C omplexNum
*p)
在任意位置重新指定矩
阵复指针指向
设置元素函数1 void SetElement(double
x,int m,int n)
在任意位置重新实矩阵
给定指定元素值
设置元素函数2 void
SetElement(ComplexNum
x,int m,int n)
在任意位置重新复矩阵
给定指定元素值
单位阵函数 void UnitMatrix(int m)产生一个指定大小的单位矩阵
矩阵赋值函数1 void AssignMat(double
*a,int m,int n)
将一维数组赋值到指定
大小的实矩阵
矩阵赋值函数2 void
AssignMat(ComplexNum
*a,int m,int n)
将一维数组赋值到指定
大小的复矩阵
矩阵赋值函数3 void AssignMat(char *a,int
m,int n)
将一维数组赋值到指定
大小的字符矩阵
矩阵加法函数 void MatrixAdd(matrix
C,matrix A,matrix B);
矩阵相加,C=A+B,外部
由C引用
矩阵减法函数 void MatrixSub(matrix
C,matrix A,matrix B)
矩阵相加,C=A-B,外部由
C引用
矩阵乘法函数1 void MatrixPlus(matrix
C,matrix A,matrix B)
矩阵相乘,C=A*B,外部由
C引用
矩阵乘法函数2 void MatrixPlus(matrix
C,matrix A,double b)
常数矩阵相乘,C=A*b,外
部由C引用
矩阵求逆函数 void MatrixInv(matrix
B,matrix A)
矩阵求逆,B=Inv(A),外部
由B引用
矩阵复制函数 void MatrixCopy(matrix
B,matrix A)
矩阵拷贝,B=A,外部由B
引用
矩阵转置函数 void Transpose(matrix
&B,matrix A);
矩阵转置,B=A',外部由B
引用
获取矩阵元素函数1 void GetElement(double
&x,int m,int n)
x=A[m,n]获取实矩阵指
定元素,外部由A引用
获取矩阵元素函数2 void
GetElement(ComplexNum
&x,int m,int n)
x=A[m,n]获取复矩阵指
定元素,外部由A引用
水平拼接函数 void
LevelLinkMatrix(matrix
&C,matrix A,matrix B)
矩阵的横向链接,C=[A
B]
垂平拼接函数 void
VerticalLinkMatrix(matrix
&C,matrix A,matrix B)
矩阵的纵向链
接,C=[A;B]
行交换函数 void ChangeRow(matrix
&B,matrix A,int m,int n)
交换矩阵A的第m、n
行,由B引用
列交换函数 void
ChangeColumn(matrix
&B,matrix A,int m,int n)
交换矩阵A的第m、n
列,由B引用
行删除函数 void RemoveRow(matrix
&B,matrix A,int del_row)
移去A矩阵的指定行,作
为B矩阵,由B引用
附录:源代码 "matrix.h"
// matrix.h: interface for the matrix class. //
/////////////////////////////////////////////////////////////////// ///
#include
#include "math.h"
#include
#include
#if !defined(AFX_MATRIX_H__D7296B39_2208_48A0_813C_B18AC9B4EA8B__I NCLUDED_)
#define
AFX_MATRIX_H__D7296B39_2208_48A 0_813C_B18AC9B4EA8B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
列删除函数 void
RemoveColumn(matrix &
B,matrix A,int del_column)
移去A矩阵的指定列,作
为B矩阵,由B引用
行向量获取函数 void GetRowVector(matrix
B,matrix A,int m)
把矩阵A指定行取出并
存入一个矩阵B,由B调
用
列向量获取函数 void
GetColumnVector(matrix
B,matrix A,int n)
把矩阵A指定列取出并
存入一个矩阵B,由B调
用
行列式值函数 double MatDet(matrix A)求出矩阵行列式,由A 引用
奇异判断函数 int IsSingle(matrix A);判断矩阵是否奇异,由A 引用
实矩阵QR分解函数 void QRReduce(matrix
&Q,matrix &R,matrix A)
实矩阵的基本QR分解
实矩阵拟上三角化函数 void
QuasiUpTriMat(matrix
&B,matrix A)
实矩阵拟上三角化
实矩阵LU分解函数 void LUReduce(matrix
&L,matrix &U,matrix A)
实矩阵的LU分解
特征值求取函数 void EigenValue(matrix
&eig,matrix A)
实矩阵的特征值
矩阵显示函数 void Display()矩阵显示到屏幕
矩阵空间释放函数 void ReleaseSpace()释放对象的矩阵所占空间
#ifndef MATRIX_H
#define MATRIX_H
//定义一个复数结构体
struct ComplexNum
{
double re;
double im;
};
//定义矩阵类
class matrix
{
private:
int
row;
int
column;
double * mat_ad;
ComplexNum * matcplx_ad;
char
*ch_ad;
public:
matrix();
virtual
~matrix();
public:
matrix(int m,int n,char p);//重载矩阵构造函数,用于初始化
matrix(int m,int n);//若双输入默认为使矩阵,用于初始化
int GetRow(){return row;}//获取矩阵行 int
GetColumn(){return column;}//获取矩阵列
double * GetMat();//获取实矩阵数据首地址函数
ComplexNum *GetMatCplx();//获取复矩阵数据首地址函数
char
*GetMatChar();//获取字符阵数据首地址函数
void CreatMat(int m,int n,char p);//创建一个指定类型的矩阵
void SetColumn(int m);//重新设置矩阵行
void SetRow(int n);//重新设置矩阵列
void SetDataAD(double *p);//重新设置实数矩阵指针地址
void SetDataAD(ComplexNum *p);//重新设置复数矩阵指针地址
void SetElement(double x,int m,int n);//重新设置矩阵的指定元素值
void SetElement(ComplexNum x,int m,int n);//重新设置复矩阵的指定元素值
void UnitMatrix(int m);//得到一个m维
单为矩阵A
void AssignMat(double *a,int m,int n);//矩阵赋值,将一维数组赋值到实矩阵
void AssignMat(ComplexNum *a,int m,int n);//矩阵赋值,将一维数组赋值到复矩
阵
void AssignMat(char *a,int m,int n);//
矩阵赋值,将一维字符数组赋值到字符矩阵
void MatrixAdd(matrix C,matrix A,matrix B);//矩阵相加,C=A+B,外部由C引
用
void MatrixSub(matrix C,matrix A,matrix B);//矩阵相减,C=A-B,外部由C引
用
void MatrixPlus(matrix C,matrix A,matrix B);//矩阵相乘,C=A*B,外部由C引
用
void MatrixPlus(matrix C,matrix A,double b);//常数矩阵相乘,C=A*b,外部由
C引用
void MatrixInv(matrix B,matrix A);//矩
阵求逆,B=Inv(A),外部由B引用
void MatrixCopy(matrix B,matrix A);//
矩阵拷贝,B=A,外部由B引用
void Transpose(matrix &B,matrix A);//
矩阵转置,B=A',外部由B引用
void GetElement(double &x,int m,int n);//把矩阵的m行,n列的元素取出来,由A
操作
void GetElement(ComplexNum &x,int m,int n);//把矩阵的m行,n列的元素取出来,
由A操作
void LevelLinkMatrix(matrix &C,matrix A,matrix B);//矩阵的横向链接,C=[A B]
void VerticalLinkMatrix(matrix
&C,matrix A,matrix B);//矩阵的纵向链接,C=[A;B]
void ChangeRow(matrix &B,matrix A,int m,int n);//交换矩阵A 的第m 、n 行 void ChangeColumn(matrix &B,matrix
A,int m,int n);//交换矩阵A 的第m 、n 列
void RemoveRow(matrix &B,matrix A,int del_row);//移去A 矩阵的指定行,作为B 矩阵 void RemoveColumn(matrix & B,matrix A,int del_column);//移去矩阵的指定列,作为B 矩阵
void GetRowVector(matrix &B,matrix
A,int m);//把矩阵A 指定行取出并存入一个矩阵B,由B 调用 void GetColumnVector(matrix &B,matrix A,int n);//把矩阵A 指定列取出并存入一个矩阵B ,由B 调用 double MatDet(matrix A);//求出矩阵行列式 bool IsSingle(matrix A);//判断矩阵是
否奇异 void QRReduce(matrix &Q,matrix
&R,matrix A);//实矩阵的基本QR 分解 void QuasiUpTriMat(matrix &B,matrix
A);//实矩阵拟上三角化 void LUReduce(matrix &L,matrix &U,matrix A);//实矩阵的LU 分解 void EigenValue(matrix &eig,matrix A);//实矩阵的特征值
void Display();//矩阵显示到屏幕 void ReleaseSpace();//释放对象 }; #endif // !defined(AFX_MATRIX_H__D7296B39_2208_48A0_813C_B18AC9B4EA8B__IN CLUDED_) #endif
" mymath.h "
#include "matrix.h" //符号函数 double sgn(double x) { if(x>0) return(1); else return(-1); } //求二维矩阵的特征值和特征方程的系数 void erwei(double &b,double &c,ComplexNum &s1,ComplexNum &s2,double * A) { double a,delta; a=1; b=-1*(A[0]+A[3]); c=A[0]*A[3]-A[1]*A[2]; delta=(b*b-4*a*c); if (delta>=0) {s1.re=(-1*b+sqrt(delta))/(2*a); s1.im=0; s2.re=(-1*b-sqrt(delta))/(2*a); s2.im=0; } else { s1.re=-1*b/(2*a); s1.im=sqrt(-1*delta)/(2*a); s2.re=-1*b/(2*a); s2.im=-1*sqrt(-1*delta)/(2*a); }
}
" matrix.cpp "
// matrix.cpp: implementation of the matrix class.
//
/////////////////////////////////////////////////////////////////// ///
#include "mymath.h"
#include "matrix.h"
/////////////////////////////////////////////////////////////////// ///
// Construction/Destruction
/////////////////////////////////////////////////////////////////// ///
//无形参构造函数
matrix::matrix()
{
row=0;
column=0;
mat_ad=NULL;
matcplx_ad=NULL;
ch_ad=NULL;
}
//若双输入默认为使矩阵,用于初始化matrix::matrix(int m,int n)
{
int
i=0;
row=m;
column=n;
mat_ad=(double
*)malloc(sizeof(double)*m*n);
for(i=0;i { mat_ad[i]=0; } matcplx_ad=NULL; ch_ad=NULL; } //指定行列数,并分配相应空间的零初始化构造函数 matrix::matrix(int m,int n,char p) { int i=0; mat_ad=NULL; matcplx_ad=NULL; if((p=='r')||(p=='R')) { row=m; column=n; mat_ad=(double *)malloc(sizeof(double)*m*n); for(i=0;i { mat_ad[i]=0; } matcplx_ad=NULL; ch_ad=NULL; } else if((p=='c')||(p=='C')) { row=m; column=n; matcplx_ad=(ComplexNum *)malloc(sizeof(ComplexNum)*m*n); for(i=0;i { matcplx_ad[i].re=0; matcplx_ad[i].im=0; } mat_ad=NULL; ch_ad=NULL; } else if((p=='l')||(p=='L')) { row=m; column=n; ch_ad=(char *)malloc(sizeof(char)*m*n); for(i=0;i { ch_ad[i]=0; } matcplx_ad=NULL; mat_ad=NULL; } else { cout<<"未知类型,请输入c或r"< } } //析构函数 matrix::~matrix() { //free(mat_ad); } //创建一个指定类型的矩阵 void matrix::CreatMat(int m,int n,char p) { int i=0; mat_ad=NULL; matcplx_ad=NULL; ch_ad=NULL; if((p=='r')||(p=='R')) { row=m; column=n; mat_ad=(double *)malloc(sizeof(double)*m*n); for(i=0;i { mat_ad[i]=0; } } else if((p=='c')||(p=='C')) { row=m; column=n; matcplx_ad=(ComplexNum *)malloc(sizeof(ComplexNum)*m*n); for(i=0;i { matcplx_ad[i].re=0; matcplx_ad[i].im=0; } } else if((p=='l')||(p=='L')) { row=m; column=n; ch_ad=(char *)malloc(sizeof(char)*m*n); for(i=0;i { ch_ad[i]=0; } } else { cout<<"未知类型,请输入c,r或l"< } } //获取矩阵数据首地址函数 double * matrix::GetMat() { if((mat_ad==NULL)&&(matcplx_ad== NULL)&&(ch_ad==NULL)) { // cout<<"矩阵不存在,或还未指定大小!"< return(NULL); } else //if((mat_ad!=NULL)&&(matcplx_ad==NUL L)) { return(mat_ad); } } //获取复矩阵数据首地址函数ComplexNum * matrix::GetMatCplx() { if((mat_ad==NULL)&&(matcplx_ad== NULL)&&(ch_ad==NULL)) { // cout<<"矩阵不存在,或还未指定大小!"< return(NULL); } else //if((mat_ad==NULL)&&(matcplx_ad!=NUL L)) { return(matcplx_ad); } } //获取字符阵数据首地址函数 char * matrix::GetMatChar() { if((mat_ad==NULL)&&(matcplx_ad== NULL)&&(ch_ad==NULL)) { // cout<<"矩阵不存在,或还未指定大小!"< return(NULL); } else //if((mat_ad==NULL)&&(matcplx_ad!=NUL L)) { return(ch_ad); } } //重新设置矩阵行 void matrix::SetRow(int m) { row=m; } //重新设置矩阵列 void matrix::SetColumn(int n) { column=n; } //重新设置实数矩阵指针地址 void matrix::SetDataAD(double *p) { mat_ad=p; } //重新设置复数矩阵指针地址 void matrix::SetDataAD(ComplexNum *p) { matcplx_ad=p; } //重新设置实矩阵的指定元素值 void matrix::SetElement(double x,int m,int n) { m=m-1; n=n-1; mat_ad[m*column+n]=x; } //重新设置复矩阵的指定元素值 void matrix::SetElement(ComplexNum x,int m,int n) { m=m-1; n=n-1; matcplx_ad[m*column+n].re=x.re; matcplx_ad[m*column+n].im=x.im; } //矩阵赋值,将一维数组赋值到实矩阵 void matrix::AssignMat(double a[],int m,int n) { //条件判断 int i=0,j=0; if((row==0)||(column==0)) { row=m; column=n; mat_ad=(double *)malloc(sizeof(double)*row*column); for(i=0;i { mat_ad[i]=0; } } for(i=0;i //条件判断 if((a_row!=b_row)||(a_column!=b_col umn)) { cout<<"A与B不能相加"< return; } if((a_ad!=NULL)&&(b_ad!=NULL)) { if((row==0)||(column==0)) { row=a_row; column=a_column; mat_ad=(double *)malloc(sizeof(double)*row*column); for(i=0;i { mat_ad[i]=0; } matcplx_ad=NULL; } for(i=0;i for(j=0;j { mat_ad[i*column+j]=a_ad[i*column+j] +b_ad[i*column+j]; } } else if((a_cplxad!=NULL)||(b_cplxad!=NULL)) { if((row==0)||(column==0)) { row=a_row; column=a_column; matcplx_ad=(ComplexNum *)malloc(sizeof(ComplexNum)*row*colum n); for(i=0;i { matcplx_ad[i].re=0; matcplx_ad[i].im=0; } mat_ad=NULL; } if((a_cplxad!=NULL)&&(b_cplxad!=N ULL)) { for(i=0;i for(j=0;j { matcplx_ad[i*column+j].re=a_cplxad[i *column+j].re+b_cplxad[i*column+j].re; matcplx_ad[i*column+j].im=a_cplxad[i*col umn+j].im+b_cplxad[i*column+j].im; } } else if((a_cplxad!=NULL)&&(b_ad!=NULL)) { for(i=0;i for(j=0;j { matcplx_ad[i*column+j].re=a_cplxad[i *column+j].re+b_ad[i*column+j]; matcplx_ad[i*column+j].im=a_cplxad[i*col umn+j].im; } } else if((a_ad!=NULL)&&(b_cplxad!=NULL)) { for(i=0;i for(j=0;j { matcplx_ad[i*column+j].re=a_ad[i*col umn+j]+b_cplxad[i*column+j].re; matcplx_ad[i*column+j].im=b_cplxad[i*col umn+j].im; } } } } //矩阵相加,C=A-B void matrix::MatrixSub(matrix C,matrix A,matrix B) { double * a_ad,* b_ad; int a_row,a_column,b_row,b_column; int i=0,j=0; ComplexNum *a_cplxad,*b_cplxad; a_row=A.GetRow(); a_column=A.GetColumn(); b_row=B.GetRow(); b_column=B.GetColumn(); a_ad=A.GetMat(); a_cplxad=A.GetMatCplx(); b_ad=B.GetMat(); b_cplxad=B.GetMatCplx(); //条件判断 if((a_row!=b_row)||(a_column!=b_col umn)) { cout<<"A与B不能相减"< return; } if((a_ad!=NULL)&&(b_ad!=NULL)) { if((row==0)||(column==0)) { row=a_row; column=a_column; mat_ad=(double *)malloc(sizeof(double)*row*column); for(i=0;i { mat_ad[i]=0; } matcplx_ad=NULL; } for(i=0;i { mat_ad[i*column+j]=a_ad[i*column+j] -b_ad[i*column+j]; } } else if((a_cplxad!=NULL)||(b_cplxad!=NULL)) { if((row==0)||(column==0)) { row=a_row; column=a_column; matcplx_ad=(ComplexNum *)malloc(sizeof(ComplexNum)*row*colum n); for(i=0;i { matcplx_ad[i].re=0; matcplx_ad[i].im=0; } mat_ad=NULL; } if((a_cplxad!=NULL)&&(b_cplxad!=N ULL)) { for(i=0;i for(j=0;j { matcplx_ad[i*column+j].re=a_cplxad[i *column+j].re-b_cplxad[i*column+j].re; matcplx_ad[i*column+j].im=a_cplxad[i*col umn+j].im-b_cplxad[i*column+j].im; } } else if((a_cplxad!=NULL)&&(b_ad!=NULL)) { for(i=0;i for(j=0;j { matcplx_ad[i*column+j].re=a_cplxad[i *column+j].re-b_ad[i*column+j]; matcplx_ad[i*column+j].im=a_cplxad[i*col umn+j].im; } } else if((a_ad!=NULL)&&(b_cplxad!=NULL)) { for(i=0;i for(j=0;j { matcplx_ad[i*column+j].re=a_ad[i*col umn+j]-b_cplxad[i*column+j].re; matcplx_ad[i*column+j].im=-b_cplxad[i*col umn+j].im; } } } } //矩阵拷贝,B=A,外部由B引用 void matrix::MatrixCopy(matrix B,matrix A) { double * a_ad,* b_ad; int a_row,a_column,b_row,b_column; int i=0,j=0; ComplexNum *a_cplxad,*b_cplxad; a_row=A.GetRow(); a_column=A.GetColumn(); b_row=B.GetRow(); b_column=B.GetColumn(); a_ad=A.GetMat(); a_cplxad=A.GetMatCplx(); b_ad=B.GetMat(); b_cplxad=B.GetMatCplx(); //拷贝条件判断 if((b_ad!=NULL)&&(a_cplxad!=NULL))//当把一个复矩阵拷贝成一个实矩阵时,输 出警告 { cout<<"警告:复数矩阵不能被拷贝 到实数矩阵!!"< return; } if ((a_ad!=NULL)&&(b_ad==NULL)&&(b_cpl xad==NULL))//a为实矩阵而b未指定大小 时 { row=a_row; column=a_column; mat_ad=(double *)malloc(sizeof(double)*row*column); for(i=0;i { mat_ad[i]=0; } matcplx_ad=NULL; for(i=0;i { for(j=0;j { mat_ad[i*a_column+j]=a_ad[i*a_colu mn+j]; } } } else if ((a_cplxad!=NULL)&&(b_ad==NULL)&&(b _cplxad==NULL))//a为复矩阵而b未指定 大小时 { row=a_row; column=a_column; matcplx_ad=(ComplexNum *)malloc(sizeof(ComplexNum)*row*colum n); for(i=0;i { matcplx_ad[i].re=0; matcplx_ad[i].im=0; } mat_ad=NULL; b_cplxad=matcplx_ad; for(i=0;i { for(j=0;j { matcplx_ad[i*a_column+j].re=a_cplxa d[i*a_column+j].re; matcplx_ad[i*a_column+j].im=a_cplx ad[i*a_column+j].im; } } } if((a_ad!=NULL)&&(b_ad!=NULL)) { for(i=0;i { for(j=0;j { b_ad[i*column+j]=a_ad[i*column+j]; } } } else if((a_cplxad!=NULL)||(b_cplxad!=NULL)) { if((a_cplxad!=NULL)&&(b_cplxad!=N ULL)) { for(i=0;i for(j=0;j { b_cplxad[i*column+j].re=a_cplxad[i*c olumn+j].re; b_cplxad[i*column+j].im=a_cplxad[i*c olumn+j].im; } } else if((a_ad!=NULL)&&(b_cplxad!=NULL)) { for(i=0;i for(j=0;j { b_cplxad[i*column+j].re=a_ad[i*colum n+j]; b_cplxad[i*column+j].im=0; } } } } //矩阵显示到屏幕 void matrix::Display() { int i,j; if((row==0)||(column==0)){cout<<"矩阵不存在!!"< if(mat_ad!=NULL) { cout<<"Row="< cout<<"Column="< { for(j=0;j { cout< '; } cout< } } else if(matcplx_ad!=NULL) { cout<<"Row="< cout<<"Column="< { for(j=0;j { printf("(%.5f)+(%.5f)i ",matcplx_ad[i*column+j].re,matcplx_ad[i* column+j].im); } cout< } } else if(ch_ad!=NULL) { cout<<"Row="< cout<<"Column="< { for(j=0;j { printf("%c ",ch_ad[i*column+j]); } cout< } } } //矩阵转置,B=A',外部由B引用 void matrix::Transpose(matrix &B,matrix A) { double * a_ad,* b_ad; int a_row,a_column,b_row,b_column; int i=0,j=0; ComplexNum *a_cplxad,*b_cplxad; a_row=A.GetRow(); a_column=A.GetColumn(); b_row=B.GetRow(); b_column=B.GetColumn(); a_ad=A.GetMat(); a_cplxad=A.GetMatCplx(); b_ad=B.GetMat(); b_cplxad=B.GetMatCplx(); //如B不存在,为其按A的属性分配相 应的空间 if((b_ad==NULL)&&(b_cplxad==NUL L)) { if((a_ad!=NULL)&&(a_cplxad==NULL )) { row=a_column; column=a_row; mat_ad=(double *)malloc(sizeof(double)*row*column); for(i=0;i { mat_ad[i]=0; } matcplx_ad=NULL; b_ad=mat_ad; } else if((a_ad==NULL)&&(a_cplxad!=NULL)) { row=a_column; column=a_row; matcplx_ad=(ComplexNum *)malloc(sizeof(ComplexNum)*row*colum n); for(i=0;i { matcplx_ad[i].re=0; matcplx_ad[i].im=0; } mat_ad=NULL; b_cplxad=matcplx_ad; } } //实数矩阵转置 if((a_ad!=NULL)&&(b_ad!=NULL)) { for(i=0;i { for(j=0;j { mat_ad[i*column+j]=a_ad[j*row+i]; } } } //复数矩阵转置 else if((a_cplxad!=NULL)&&(b_cplxad!=NULL)) { for(i=0;i for(j=0;j { b_cplxad[i*column+j].re=a_cplxad[j*ro w+i].re; b_cplxad[i*column+j].im=a_cplxad[j*r ow+i].im; } } else //矩阵转置类型不同时,输出警告 { cout<<"矩阵类型不相容,不能转 置!!"< return; } } //移去A矩阵的指定行,作为B矩阵,由B引 用 void matrix::RemoveRow(matrix &B,matrix A,int del_row) { double * a_ad,* b_ad; int a_row,a_column,b_row,b_column; int i=0,j=0; ComplexNum *a_cplxad,*b_cplxad; a_row=A.GetRow(); a_column=A.GetColumn(); b_row=B.GetRow(); b_column=B.GetColumn(); a_ad=A.GetMat(); a_cplxad=A.GetMatCplx(); b_ad=B.GetMat(); b_cplxad=B.GetMatCplx(); //移除行条件判断 if((b_ad!=NULL)&&(a_cplxad!=NULL) )//当把一个复矩阵移除行成一个实矩阵时,输出警告 { cout<<"警告:复数矩阵不能通过移除一行到实数矩阵!!"< return; } if ((a_ad!=NULL)&&(b_ad==NULL)&&(b_cpl xad==NULL))//a为实矩阵而b未指定大小时 { row=a_row-1; column=a_column; mat_ad=(double *)malloc(sizeof(double)*row*column); for(i=0;i { mat_ad[i]=0; } matcplx_ad=NULL; for(i=0;i { for(j=0;j { if(i { mat_ad[i*a_column+j]=a_ad[i*a_colu mn+j]; } else if(i>del_row-1) { mat_ad[(i-1)*a_column+j]=a_ad[i*a_c olumn+j]; } } } B.SetRow(row); } else if ((a_cplxad!=NULL)&&(b_ad==NULL)&&(b _cplxad==NULL))//a为复矩阵而b未指定 大小时 { row=a_row-1; column=a_column; matcplx_ad=(ComplexNum *)malloc(sizeof(ComplexNum)*row*colum n); for(i=0;i { matcplx_ad[i].re=0; matcplx_ad[i].im=0; } mat_ad=NULL; b_cplxad=matcplx_ad; for(i=0;i { for(j=0;j { if(i { matcplx_ad[i*a_column+j].re=a_cplxa d[i*a_column+j].re; matcplx_ad[i*a_column+j].im=a_cplx ad[i*a_column+j].im; } else if(i>del_row-1) { matcplx_ad[(i-1)*a_column+j].re=a_c plxad[i*a_column+j].re; matcplx_ad[(i-1)*a_column+j].im=a_c plxad[i*a_column+j].im; } } } B.SetRow(row); } if((a_ad!=NULL)&&(b_ad!=NULL)) { if((row==0)||(column==0)) { row=a_row-1; column=a_column; mat_ad=(double *)malloc(sizeof(double)*row*column); for(i=0;i { mat_ad[i]=0; } matcplx_ad=NULL; } for(i=0;i { for(j=0;j { if(i { mat_ad[i*a_column+j]=a_ad[i*a_colu mn+j]; } else if(i>del_row-1) { mat_ad[(i-1)*a_column+j]=a_ad[i*a_c olumn+j]; } } } B.SetRow(row); } else if((a_cplxad!=NULL)||(b_cplxad!=NULL)) { if((row==0)||(column==0)) { row=a_row-1; column=a_column; matcplx_ad=(ComplexNum *)malloc(sizeof(ComplexNum)*row*colum n); for(i=0;i { matcplx_ad[i].re=0; matcplx_ad[i].im=0; } mat_ad=NULL; b_cplxad=matcplx_ad; } if((a_cplxad!=NULL)&&(b_cplxad!=N ULL)) { for(i=0;i { for(j=0;j { if(i { matcplx_ad[i*a_column+j].re=a_cplxa d[i*a_column+j].re; matcplx_ad[i*a_column+j].im=a_cplx ad[i*a_column+j].im; } else if(i>del_row-1) { matcplx_ad[(i-1)*a_column+j].re=a_c plxad[i*a_column+j].re; matcplx_ad[(i-1)*a_column+j].im=a_c plxad[i*a_column+j].im; } } } B.SetRow(row); } else if((a_ad!=NULL)&&(b_cplxad!=NULL)) { for(i=0;i { for(j=0;j { if(i { matcplx_ad[i*a_column+j].re=a_ad[i* a_column+j]; matcplx_ad[i*a_column+j].im=0; } else if(i>del_row-1) { matcplx_ad[(i-1)*a_column+j].re=a_a d[i*a_column+j]; matcplx_ad[(i-1)*a_column+j].im=0; } } } } B.SetRow(row); } } //移去矩阵的指定列,作为B矩阵 void matrix::RemoveColumn(matrix & B,matrix A,int del_column) { matrix C,D; C.Transpose(C,A); D.RemoveRow(D,C,del_column); B.Transpose(B,D); C.ReleaseSpace(); D.ReleaseSpace(); } //矩阵相乘,C=A*B void matrix::MatrixPlus(matrix C,matrix A,matrix B) { double * a_ad,* b_ad; int a_row,a_column,b_row,b_column; int i=0,j=0,k=0; ComplexNum *a_cplxad,*b_cplxad,sum; double temp=0; a_row=A.GetRow(); a_column=A.GetColumn(); b_row=B.GetRow(); b_column=B.GetColumn(); a_ad=A.GetMat(); a_cplxad=A.GetMatCplx(); b_ad=B.GetMat(); b_cplxad=B.GetMatCplx(); //相乘条件判断 if(a_column!=b_row)//当A的列数和B 的行数不相等时,输出警告 { cout<<"警告:A,B不能相乘!!"< return; } if((a_ad!=NULL)&&(b_ad!=NULL)) { if((row==0)||(column==0)) { row=a_row; column=b_column; mat_ad=(double *)malloc(sizeof(double)*row*column); for(i=0;i { mat_ad[i]=0; } matcplx_ad=NULL; } for(i=0;i { for(j=0;j { for(k=0;k { temp=a_ad[i*a_column+k]*b_ad[k*b_column+j]+temp; } mat_ad[i*b_column+j]=temp; temp=0; } } } else if((a_cplxad!=NULL)||(b_cplxad!=NULL)) { if((row==0)||(column==0)) { row=a_row; column=b_column; matcplx_ad=(ComplexNum *)malloc(sizeof(ComplexNum)*row*colum n); for(i=0;i { matcplx_ad[i].re=0; matcplx_ad[i].im=0; } mat_ad=NULL; } if((a_cplxad!=NULL)&&(b_cplxad!=N ULL)) { sum.re=0; sum.im=0; for(i=0;i for(k=0;k { for(j=0;j { sum.re=sum.re+a_cplxad[i*a_column +j].re*b_cplxad[j*b_column+k].re-a_cplxad [i*a_column+j].im*b_cplxad[j*b_column+k] .im; sum.im=sum.im+a_cplxad[i*a_colum n+j].re*b_cplxad[j*b_column+k].im+a_cplx ad[i*a_column+j].im*b_cplxad[j*b_column +k].re; } matcplx_ad[i*b_column+k]=sum; sum.re=0; sum.im=0; } } else if((a_cplxad!=NULL)&&(b_ad!=NULL)) { sum.re=0; sum.im=0; for(i=0;i for(k=0;k { for(j=0;j { sum.re=sum.re+a_cplxad[i*a_column +j].re*b_ad[j*b_column+k]; sum.im=sum.im+a_cplxad[i*a_colum n+j].im*b_ad[j*b_column+k]; } matcplx_ad[i*b_column+k]=sum; sum.re=0; sum.im=0; } } else if((a_ad!=NULL)&&(b_cplxad!=NULL)) { sum.re=0; sum.im=0; for(i=0;i for(k=0;k { for(j=0;j { sum.re=sum.re+b_cplxad[i*a_column +j].re*a_ad[j*b_column+k]; sum.im=sum.im+b_cplxad[i*a_colum n+j].im*a_ad[j*b_column+k]; } matcplx_ad[i*b_column+k]=sum; sum.re=0; sum.im=0; } } } } //常数矩阵相乘,C=A*b,外部由C引用 void matrix::MatrixPlus(matrix C,matrix A,double b) { double * a_ad; int a_row,a_column,c_row,c_column; int i=0,j=0,k=0; ComplexNum *a_cplxad; a_row=A.GetRow(); a_column=A.GetColumn(); a_ad=A.GetMat(); a_cplxad=A.GetMatCplx(); c_row=C.GetRow(); c_column=C.GetColumn(); //相乘条件判断 if(((c_row!=a_row)||(c_column!=a_col umn))&&(!((row==0)||(column==0)))) { cout<<"警告:输出矩阵C大小错 误!!"< return; } if((row==0)||(column==0))