数据结构小学期(温习温习。。。)(2021)——实现矩阵的加减乘、矩阵的逆、矩阵的特征值和特征值等运算

1、实现矩阵的加减乘、矩阵的逆、矩阵的特征值和特征值等运算

  timu2.cpp

  (代码说明:

    1、timu2.cpp 文件对后三个.cpp文件进行引用,运行时需要放在同一文件目录下

    2、juzhennis.cpp 文件实现了3x3矩阵的逆运算

    3、bianyuans.cpp 文件实现了带有变量的矩阵的相关运算

    4、xiangliangs.cpp 文件实现了矩阵特征值以及特征向量的运算(其中特征值以及特征向量的结果未进行精度控制,可自行设置)  

  )

#include <iostream>
#include <malloc.h>
#include <stdio.h>
#include"juzhennis.cpp"
#include"bianyuans.cpp"
#include"xiangliangs.cpp"
using namespace std;
typedef struct
{
    //结构体
    int row,col;
    //二维指针,目的是动态分配内存
    float **matris;
} Matris;
Matris CreateMatris()                   //创建矩阵,输入矩阵个点数值
{
    Matris m;
    int row,col;                        //矩阵 行数 列数
    cout << "输入行数与列数:" << endl;
    cin >> row >> col;
    float **enterMatris;                    //定义动态内存空间
    enterMatris=(float**) malloc(row*sizeof(float*)) ;          //为矩阵动态分配内存
    for(int i=0; i<row; i++)
        enterMatris[i] = (float *)malloc(col * sizeof(float));  //每一行分配内存
    cout<<"输入你的矩阵:"<<endl;
    for(int i=0; i<row; i++)
    {
        for(int j=0; j<col; j++)
        {
            cin >> enterMatris[i][j];
        }
    }
    m.col = col;                                //行数赋值给结构体变量
    m.row = row;                                //列数赋值给结构体变量
    m.matris = enterMatris;
    return m;
}
//初始化一个行为row列为col矩阵
Matris InitMatris(int row,int col)
{
    Matris m;
    float **matris ;
    matris=(float**) malloc(row*sizeof(float*)) ;
    for(int i=0; i<row; i++)
        matris[i] = (float *)malloc(col * sizeof(float));
    for(int i=0; i<row; i++)
    {
        for(int j=0; j<col; j++)
        {
            matris[i][j] = 0;           //初始化矩阵赋值为0
        }
    }
    m.col = col;
    m.row = row;
    m.matris = matris;
    return m;
}
Matris add(Matris m1, Matris m2)        //矩阵相加
{
    for(int i=0; i<m1.row; i++)
    {
        for(int j=0; j<m1.col; j++)
        {
            m1.matris[i][j] = m1.matris[i][j] +m2.matris[i][j];     //数值类型相加运算
        }
    }
    return m1;
}
Matris sub(Matris m1, Matris m2)            //矩阵相减
{
    for(int i=0; i<m1.row; i++)
    {
        for(int j=0; j<m1.col; j++)
        {
            m1.matris[i][j] = m1.matris[i][j] -m2.matris[i][j];
        }
    }
    return m1;
}
int calRowCol(Matris M1,Matris M2,int row,int col)//row为M1的行 col为m2的列
{
    int result = 0;
    int same = M1.col;
    for(int j=0; j<same; j++)
    {
        result+=M1.matris[row][j]*M2.matris[j][col];
    }

    return result;
}
Matris Mul(Matris m1, Matris m2)            //矩阵相乘
{
    Matris re = InitMatris(m1.row,m2.col);
    for(int i=0;i<m1.row;i++)
    {
        for(int j=0;j<m2.col;j++)
        {
            re.matris[i][j]= calRowCol(m1,m2,i,j);
        }
    }
    return re;
}
Matris numMul(Matris m, int num)            //矩阵数乘
{
    cout<<"数值:"<<num<<endl;
    for(int i=0; i<m.row; i++)
    {
        for(int j=0; j<m.col; j++)
        {
            m.matris[i][j] = m.matris[i][j]*num;
        }
    }
    return m;
}
Matris printMatris(Matris m)                //矩阵输出
{
    for(int i=0; i<m.row; i++)
    {
        for(int j=0; j<m.col; j++)
        {
            cout << m.matris[i][j] << "  ";
        }
        cout<<endl;
    }
}
int main()
{
    int num = 0;
    do
    {
        cout<<endl;
        cout<<"*************************************\n";
        cout<<"*              菜单                 *\n";
        cout<<"*          1.矩阵相加               *\n";
        cout<<"*          2.矩阵相减               *\n";
        cout<<"*          3.矩阵相乘               *\n";
        cout<<"*          4.矩阵数乘               *\n";
        cout<<"*          5.矩阵的逆               *\n";
        cout<<"*          6.变元运算               *\n";
        cout<<"*          7.向量运算               *\n";
        cout<<"*          8.退出                   *\n";
        cout<<"*************************************\n";
        cin>>num;
        if(1 == num|| 2 == num || 3 == num)
        {
            cout<<"请输入矩阵1"<<endl;
            Matris m1 = CreateMatris();
            cout<<"请输入矩阵2"<<endl;
            Matris m2 = CreateMatris();
            cout<<"两矩阵为"<<endl;
            printMatris(m1);
            cout<<endl;
            printMatris(m2);
            switch(num)
            {
            case 1:
            {
                if(m1.col!=m2.col || m1.row!=m2.row)
                {
                    cout<<"行列不同"<<endl;
                }
                else{
                    cout<<"结果为:"<<endl;
                    printMatris(add(m1,m2));
                }
                break;
            }
            case 2:
            {

                if(m1.col!=m2.col || m1.row!=m2.row)
                {
                    cout<<"参数错误"<<endl;
                }
                else{
                    cout<<"结果为:"<<endl;
                    printMatris(sub(m1,m2));
                }
                break;

            }
            case 3:
            {
                if(m1.col!=m2.row)
                {
                    cout<<"参数错误"<<endl;
                }
                else{
                    cout<<"结果为:"<<endl;
                    printMatris(Mul(m1,m2));
                }
                break;
            }
            default:
                break;
            }
        }
        else if(4 == num)
        {
            int number = 1;
            cout<<"请输入矩阵"<<endl;
            Matris m = CreateMatris();
            cout<<"请输入数值"<<endl;
            cin>>number;
            cout<<"矩阵为:"<<endl;
            printMatris(m);
            cout<<"数值为:"<<endl;
            cout<<number<<endl;
            printMatris(numMul(m,number));
        }
        else if(5 == num)
        {
            juzhenni();
        }
        else if(6 == num)
        {
            bianyuans();
        }
        else if(7 == num)
        {
            xiangliangs();
        }
        //cout<<"按回车继续....";
        //getchar();
        //getchar();
       // system("cls");
    }while(1 == num|| 2 == num || 3 == num ||4 == num||5 == num||6 == num||7 == num);
    return 0;
}
View Code

  juzhennis.cpp

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int juzhenni()
{
    int p=0,n=0;
    double s1[3][3];
    double s2[4][4];
    do
    {
        cout<<"请输入方阵行列数(3或4):"<<endl;
        cin>>p;
        if(p==3)
        {
            Matrix3d A;  //定义3*3  double 型矩阵
            cout<<"请输入矩阵各个数值:"<<endl;
            for(int i=0;i<p;i++)
            {
                for(int j=0;j<p;j++)
                    cin>>s1[i][j];
            }
            A << s1[0][0], s1[0][1], s1[0][2], s1[1][0],s1[1][1],s1[1][2],s1[2][0],s1[2][1],s1[2][2];
            cout << "A矩阵显示:" << endl << A << endl << endl;
            cout << "A逆矩阵显示为:" << endl << A.inverse() << endl;
            n=1;
        }
        if(p==4)
        {
            MatrixXd A(4,4);
            cout<<"请输入矩阵各个数值:"<<endl;
            for(int i=0;i<p;i++)
            {
                for(int j=0;j<p;j++)
                    cin>>s2[i][j];
            }
            A << s2[0][0], s2[0][1], s2[0][2],s2[0][3],
                 s2[1][0], s2[1][1], s2[1][2],s2[1][3],
                 s2[2][0], s2[2][1], s2[2][2],s2[2][3],
                 s2[3][0], s2[3][1], s2[3][2],s2[3][3];
            cout << "A矩阵显示:" << endl << A << endl << endl;
            cout << "A逆矩阵显示为:" << endl << A.inverse() << endl;
            n=1;
        }
    }while(n==0);
    return 5;
}
View Code

  bianyuans.cpp

#include<iostream>
#include<cstring>
#include<string>
#include<sstream>
using namespace std;
bool isnum(string s)
{
        stringstream sin(s);
        double t;
        char p;
        if(!(sin >> t))
        /*解释:
            sin>>t表示把sin转换成double的变量(其实对于int和float型的都会接收),如果转换成功,则值为非0,如果转换不成功就返回为0
        */
               return false;
        if(sin >> p)
        /*解释:此部分用于检测错误输入中,数字加字符串的输入形式(例如:34.f),在上面的的部分(sin>>t)已经接收并转换了输入的数字部分,在stringstream中相应也会把那一部分给清除,如果此时传入字符串是数字加字符串的输入形式,则此部分可以识别并接收字符部分,例如上面所说的,接收的是.f这部分,所以条件成立,返回false;如果剩下的部分不是字符,那么则sin>>p就为0,则进行到下一步else里面
          */
                return false;
        else
                return true;
}
int string2int(string str){                 //string类型转整型
    stringstream ss;
    ss << str;
    int result;
    ss >> result;
    return result;
}
string int2string(int num){                 //整型转string类型
    stringstream ss;
    ss << num; //将数字传入流中
    string result;
    ss >> result; //将流中的值写入到result中
    return result;
}
int shuchu(int r1,int c1,int r2,int c2)
{
    cout<<"请输入第一个矩阵各个数值:"<<endl;
    string s1[r1][c1];
    string s3[r2][c2];
    for(int i=0;i<r1;i++)
    {
        for(int j=0;j<c1;j++)
            cin>>s1[i][j];                  //输入矩阵1各个数值
    }
    for(int j=0;j<r1;j++)
    {
        for(int i=0;i<c1;i++)
            cout<<s1[j][i]<<'\t';           //输出矩阵1各个数值
        cout<<endl;
    }
    cout<<"请输入第二个矩阵各个数值:"<<endl;
    string s2[r2][c2];
    for(int i=0;i<r2;i++)
    {
        for(int j=0;j<c2;j++)
            cin>>s2[i][j];                  //输入矩阵2各个数值
    }
    for(int j=0;j<r2;j++)
    {
        for(int i=0;i<c2;i++)
            cout<<s2[j][i]<<'\t';           //输出矩阵2各个数值
        cout<<endl;
    }
    if(r1==r2&&c1==c2)
    {
        cout<<"矩阵相加输出为:"<<endl;
        for(int i=0;i<r1;i++)
        {
            for(int j=0;j<c1;j++)
            {
                if(isnum(s1[i][j])&&isnum(s2[i][j]))            //判断字符串为整型数值后
                {
                    int a=string2int(s1[i][j]);
                    int b=string2int(s2[i][j]);
                    a=a+b;                                      //数值相加
                    s3[i][j]=int2string(a);
                }
                else
                {
                    s3[i][j]=s1[i][j]+"+"+s2[i][j];             //非整型数值时进行字符相加
                }
                cout<<s3[i][j]<<'\t';                           //相加后直接进行输出矩阵数值
            }
            cout<<endl;
        }
        cout<<"矩阵相减输出为:"<<endl;
        for(int i=0;i<r1;i++)
        {
            for(int j=0;j<c1;j++)
            {
                if(isnum(s1[i][j])&&isnum(s2[i][j]))    //进行字符串是否为整型数值判断
                {
                    int a=string2int(s1[i][j]);
                    int b=string2int(s2[i][j]);
                    a=a-b;                              //数值相减
                    s3[i][j]=int2string(a);
                }
                else
                {
                    s3[i][j]=s1[i][j]+"-"+s2[i][j];     //进行字符相减即变元相减
                }
                cout<<s3[i][j]<<'\t';
            }
            cout<<endl;
        }
        if(r1==c1)
        {
            cout<<"矩阵相乘(数乘)输出为:"<<endl;
            for(int i=0;i<r1;i++)
            {
                for(int j=0;j<c1;j++)
                {
                    if(isnum(s1[i][j])&&isnum(s2[i][j]))
                    {
                        int a=string2int(s1[i][j]);
                        int b=string2int(s2[i][j]);
                        a=a*b;                          //进行数值相乘
                        s3[i][j]=int2string(a);
                    }
                    else
                    {
                        s3[i][j]=s1[i][j]+"*"+s2[i][j];
                    }
                    cout<<s3[i][j]<<'\t';
                }
                cout<<endl;
            }
            string s;
            cout<<"矩阵相乘(点乘)输出为:"<<endl;
            for(int i=0;i<r1;i++)
            {
                for(int j=0;j<c2;j++)
                {
                    s="";
                    for(int k=0;k<c1;k++)
                    {
                        s=s+s1[i][k]+"*"+s2[k][i]+"+";
                    }
                    s.erase(s.end()-1);
                    cout<<s<<'\t';
                }
                cout<<endl;
            }
        }
        return 1;
    }
    else if(c1==r2&&r1!=c1)
    {
        string s;
        cout<<"矩阵相乘(点乘)输出为:"<<endl;
        for(int i=0;i<r1;i++)
        {
            for(int j=0;j<c2;j++)
            {
                s="";
                for(int k=0;k<c1;k++)
                {
                    s=s+s1[i][k]+"*"+s2[k][i]+"+";
                }
                s.erase(s.end()-1);
                cout<<s<<'\t';
            }
            cout<<endl;
        }
        return 1;
    }
    else
    {
        cout<<"你的输入有误,请重新输入!!!"<<endl;
        return 0;
    }
}
int bianyuans()
{
    int n=0;
    cout<<"变元矩阵运算(数值可为单个字符多个字符和数字)"<<endl;
    do{
        cout<<"请输入第一个矩阵行数和列数:"<<endl;
        int r1,c1;
        cin>>r1>>c1;
        cout<<"请输入第二个矩阵行数和列数:"<<endl;
        int r2,c2;
        cin>>r2>>c2;
        n=shuchu(r1,c1,r2,c2);
    }while(n==0);
    return 6;
}
View Code

  xiangliangs.cpp

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int xiangliangs()
{
    int p=0;
    double s1[3][3];
    double s2[4][4];
    do
    {
        cout<<"请输入方阵行列数(3或4):"<<endl;
        cin>>p;
        if(p==3)
        {
            Matrix3d A;  //定义3*3  double 型矩阵
            cout<<"请输入矩阵各个数值:"<<endl;
            for(int i=0;i<p;i++)
            {
                for(int j=0;j<p;j++)
                    cin>>s1[i][j];
            }
            A << s1[0][0],s1[0][1],s1[0][2],
                 s1[1][0],s1[1][1],s1[1][2],
                 s1[2][0],s1[2][1],s1[2][2];
            cout << "A矩阵显示:" << endl << A << endl << endl;
            EigenSolver<MatrixXd> es(A);

            cout << "A的特征值为:" << endl << es.eigenvalues() << endl;

            MatrixXcd vect = es.eigenvectors();//特征向量矩阵
            cout << "特征向量复数形式输出:" << endl << vect << endl;
            p=1;
        }
        if(p==4)
        {
            MatrixXd A(4,4);
            cout<<"请输入矩阵各个数值:"<<endl;
            for(int i=0;i<p;i++)
            {
                for(int j=0;j<p;j++)
                    cin>>s2[i][j];
            }
            A << s2[0][0], s2[0][1], s2[0][2],s2[0][3],
                 s2[1][0], s2[1][1], s2[1][2],s2[1][3],
                 s2[2][0], s2[2][1], s2[2][2],s2[2][3],
                 s2[3][0], s2[3][1], s2[3][2],s2[3][3];
            cout << "A矩阵显示:" << endl << A << endl << endl;
            EigenSolver<MatrixXd> es(A);

            cout << "A的特征值为:" << endl << es.eigenvalues() << endl;

            MatrixXcd vect = es.eigenvectors();//特征向量矩阵
            cout << "特征向量复数形式输出:" << endl << vect << endl;
            p=1;
        }
        else
        {
            //cout<<"输入有误,请重新输入!!!"<<endl;
            break;
        }
    }while(p==0);

    return 7;
}
View Code

 

posted @ 2022-06-15 19:45  往心。  阅读(11)  评论(0编辑  收藏  举报