行向量与列向量库源码

这是一个C++实现的复数矩阵类库,包括CRowVector和CColVector类表示行向量和列向量,以及COMPMAT类表示矩阵。类中包含矩阵的基本操作如赋值、加减法和乘法,还包括矩阵的共轭转置和求逆。代码中使用了高斯-约当消去法进行矩阵求逆。
摘要由CSDN通过智能技术生成

#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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值