#ifndef COMPMAT_H_
#define COMPMAT_H_
#include <iostream>
#include"mystring.h"
#include "compclass.h"
class CRowVector
{
//行向量定义
public:
COMP *data;
int n;
int order;//序号
int needdelete;//能否删除
char name[20];//名称,方便调试
void show();
CRowVector(int m)
{
n=m;
strlet(name,"");
needdelete=1;
data=new COMP[n];
int i;
for(i=0;i<n;i++)
{
(data+i)->rmz=0;
(data+i)->imz=0;
}
}
~CRowVector()
{
if(needdelete) delete[] data;
else needdelete=1;
}
};
void CRowVector::show()
{
int i;
cout<<name<<endl;
for(i=0;i<n;i++)
{
cout<<(data+i)->rmz<<"+i"<<(data+i)->imz<<"\t";
}
cout<<endl;
}
class CColVector
{//列向量定义
public:
COMP *data;
int n;
int order;//序号
int needdelete;//能否删除
char name[20];//名称,方便调试
void show();
CColVector(int m)
{
n=m;
strlet(name,"");
needdelete=1;
data=new COMP[n];
int i;
for(i=0;i<n;i++)
{
(data+i)->rmz=0;
(data+i)->imz=0;
}
}
~CColVector()
{
if(needdelete) delete[] data;
else needdelete=1;
}
};
void CColVector::show()
{
int i;
cout<<name<<endl;
for(i=0;i<n;i++)
{
cout<<(data+i)->rmz<<"+i"<<(data+i)->imz<<"\n";
}
cout<<endl;
}
int COMPMATTotal=0;
//构造矩阵类MATRIX_H
class COMPMAT
{
public:
COMP *data;
int row;
int col;
int size;
int order;//序号
int needdelete;//能否删除
char name[20];//名称,方便调试
void show();
public:
COMPMAT(int,int);
COMPMAT(int ,int ,char*);
~COMPMAT();
const COMPMAT &operator=(const COMPMAT &);//赋值
COMPMAT operator+(COMPMAT &);//矩阵元素相加
COMPMAT operator-(COMPMAT &);//矩阵元素相减
COMPMAT operator*(COMPMAT &);
COMPMAT gonge( );
COMPMAT inverse(double );
};
COMPMAT::COMPMAT(int r,int c){
row=r;
col=c;
size=row*col;
strlet(name,"");
order=COMPMATTotal++;
needdelete=1;
data=new COMP[size];
int i,j;
for(i=0;i<row;i++)
{ for(j=0;j<col;j++)
{
(data+i*col+j)->rmz=0;
(data+i*col+j)->imz=0;
}
}
}
COMPMAT::COMPMAT(int r,int c,char*str)
{
row=r;
col=c;
size=row*col;
order=COMPMATTotal++;
needdelete=1;
strlet(name,str);
data=new COMP[size];
int i,j;
for(i=0;i<row;i++)
{ for(j=0;j<col;j++)
{
(data+i*col+j)->rmz=0;
(data+i*col+j)->imz=0;
}
}
}
COMPMAT::~COMPMAT()
{
if(needdelete) delete[] data;
else needdelete=1;
//cout<<"\n以下是第("<<order<< ")个矩阵("<<name<<")调用析构"<<"\t[内存地址为:("<<this<<")] \n";
}
void COMPMAT::show()
{
int i,j;
cout.precision(6);//控制小数精度
cout<<"\n以下是第("<<order<< ")个矩阵 "<<name<<" [内存地址为:"<<this<<"]\n";
for(i=0;i<this->row;i++)
{ for(j=0;j<this->col;j++)
{
cout<<(this->data+i*this->col+j)->rmz<<"+i"<<(this->data+i*this->col+j)->imz<<"\t";
}
cout<<"\n";
}
}
const COMPMAT &COMPMAT::operator=(const COMPMAT &mat)
{
if(&mat!=this)//检查早否自我赋值
{
delete [] data; //回收内存空间
row=mat.row;
col=mat.col;
size=mat.size; //指定对象大小
data=new COMP[size]; //为对象拷贝分配内存空间
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
data[i*col+j]=mat.data[i*col+j]; //把矩阵元素拷贝到矩阵中
}
return *this;
}
COMPMAT COMPMAT::operator+(COMPMAT &mat)//矩阵元素相加
{
int i=0,j=0;
COMPMAT temp(row,col);temp.needdelete=0;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
temp.data[i*col+j]=data[i*col+j]+mat.data[i*col+j];
return temp;
}
COMPMAT COMPMAT::operator-(COMPMAT &mat)//矩阵元素相减
{
int i=0,j=0;
COMPMAT temp(row,col);temp.needdelete=0;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
temp.data[i*col+j]=data[i*col+j]-mat.data[i*col+j];
return temp;
}
/* 需要调用复数运算的算法*/
/*======================================================
//函数名:cmat_mul
//功能描述:两个复矩阵相乘
//输入参数:a(左矩阵) b(右矩阵) c(结果矩阵)
m(左矩阵行数) p(左矩阵列数) n(右矩阵列数)
//返回值:运行成功则返回1,失败则返回0
=========================================================*/
//int COMPMAT::c_matmul(COMPMAT &a, COMPMAT &b, COMPMAT &c)
COMPMAT COMPMAT:: operator*(COMPMAT &b)
{
int i,j,k;
COMP tmp1, tmp2;
COMPMAT c(row,b.col);c.needdelete=0;
for(i=0; i<row; i++) /* 循环遍历矩阵c中的每个元素*/
for(j=0; j<b.col; j++)
{
tmp1.rmz = 0.0; /* 初值先存入复临时变量中*/
tmp1.imz = 0.0;
for(k=0; k<col; k++) /* 循环累加*/
{
//c_comp_product(&a[i*m+k], &b[k*m+j], &tmp2);
tmp2=*(data+i*row+k)**(b.data+k*row+j);
// c_comp_plus(&tmp1,&tmp2,&tmp1);
tmp1=tmp1-tmp2;
}
(c.data+i*b.col+j)->rmz = tmp1.rmz; /* 将计算的结果存入矩阵c中*/
(c.data+i*b.col+j)->imz = tmp1.imz;
}
return(c);
}
/*======================================================
// 函数名:c_minv
// 功能描述:用高斯-约当消去法进行复矩阵原地求逆
// 输入参数:mat 待求逆的矩阵,求解成功后存放逆矩阵
// n 矩阵阶数
// eps 精度要求,小于eps的值,认为是0。
// 返回值:整型。运行成功则返回1,失败则返回0
=========================================================*/
COMPMAT COMPMAT:: inverse(double eps)
{
int *is,*js,i,j,k,l,v;
COMP c_tmp;
double tmp,d;
is =new int[row]; /* 为行交换记录分配空间并检测是否成功*/
js =new int[row]; /* 为列交换记录分配空间并检测是否成功*/
if(row!=col) return *this;
for(k=0; k<row; k++)
{
d = 0.0;
for(i=k; i<row; i++) /* 此循环用于选取主元*/
for(j=k; j<row; j++)
{
l = i*row + j;
tmp = (data+l)->rmz*(data+l)->rmz + (data+l)->imz*(data+l)->imz; /* 求元素的模*/
if(tmp>d)
{
d = tmp;
is[k] = i;
js[k] = j;
}
}
if(d < eps) /* 判断主元是否过小*/
{
free(is); /* 若主元过小则退出程序*/
free(js);
cout<<("Matrix inverse failed.\n");
return(*this);
}
if(is[k]!=k) /* 判断是否需要行交换*/
for (j=0; j<=row-1; j++) /* 进行行交换*/
{
l = k*row+ j;
v = is[k]*row + j;
tmp = (data+l)->rmz;
(data+l)->rmz = (data+v)->rmz;
(data+v)->rmz = tmp;
tmp = (data+l)->imz;
(data+l)->imz = (data+v)->imz;
(data+v)->imz = tmp;
}
if(js[k]!=k) /* 判断是否需要列交换*/
for (i=0; i<=row-1; i++) /* 进行列交换*/
{
l = i*row + k;
v = i*row +js[k];
tmp = (data+l)->rmz;
(data+l)->rmz = (data+v)->rmz;
(data+v)->rmz = tmp;
tmp = (data+l)->imz;
(data+l)->imz =(data+v)->imz;
(data+v)->imz = tmp;
}
l = k*row + k; /* 归一化计算的第一步*/
(data+l)->rmz =(data+l)->rmz/d;
(data+l)->imz = -(data+l)->imz/d;
for(j=0; j<=row-1; j++) /* 归一化计算的第二步,需要使用复数的乘法*/
if(j!=k)
{
v = k*row + j;
*(data+v)=*(data+v)**(data+l);
//c_comp_product(&mat[v], &mat[l], &mat[v]);
}
for(i=0; i<=row-1; i++) /* 消元计算的第一步*/
if(i!=k)
{
for (j=0; j<=row-1; j++)
if (j!=k)
{
//c_comp_product(&mat[k*n+j], &mat[i*n+k], &c_tmp);
c_tmp=*(data+k*row+j)**(data+i*row+k);
(data+i*row+j)->rmz = (data+i*row+j)->rmz - c_tmp.rmz;
(data+i*row+j)->imz = (data+i*row+j)->imz - c_tmp.imz;
}
}
for(i=0; i<=row-1; i++) /* 消元计算的第二步*/
if(i!=k)
{
v = i*row + k;
//c_comp_product(&mat[l], &mat[v], &mat[v]);
*(data+v)=*(data+l)**(data+v);
(data+v)->rmz = -(data+v)->rmz;
(data+v)->imz = -(data+v)->imz;
}
}
for(k=row-1; k>=0; k--) /* 依照行交换和列交换的历史进行结果恢复*/
{
if(js[k]!=k) /* 判断是否需要恢复*/
for(j=0; j<=row-1; j++) /* 按列交换的历史进行行交换*/
{
l = k*row + j;
v=js[k]*row + j;
tmp = (data+l)->rmz;
(data+l)->rmz = (data+v)->rmz;
(data+v)->rmz = tmp;
tmp = (data+l)->imz;
(data+l)->imz = (data+v)->imz;
(data+v)->imz = tmp;
}
if(is[k]!=k)
for(i=0; i<=row-1; i++) /* 按行交换的历史进行列交换*/
{
l = i*row + k;
v = i*row + is[k];
tmp =(data+l)->rmz;
(data+l)->rmz = (data+v)->rmz;
(data+v)->rmz = tmp;
tmp = (data+l)->imz;
(data+l)->imz = (data+v)->imz;
(data+v)->imz = tmp;
}
}
free(is); /* 释放分配的空间*/
free(js);
return(*this); /* 求解成功,返回1*/
}
COMPMAT COMPMAT::gonge( )
{
COMPMAT c(row,col);c.needdelete=0;
int i,j;
for (i=0;i<row;i++)
for (j=0;j<col;j++)
{
(c.data+i*col+j)->rmz=(this->data+i*col+j)->rmz;
(c.data+i*col+j)->imz=-(this->data+i*col+j)->imz;
}
return c;
}
#endif