当前位置:文档之家› 矩阵类文档及函数

矩阵类文档及函数

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))

相关主题
文本预览
相关文档 最新文档