矩阵运算(加减乘除) 代码参考

  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 void add();
  6 void sub();
  7 void mul();
  8 void div();
  9 
 10 int main()
 11 {
 12     int choice=0;
 13     cout<<"本程序提供行与列均不超过100的矩阵的加减乘除操作"<<endl;
 14     cout<<"输入矩阵的格式如下:"<<endl;
 15     cout<<"1 2 3 4 5 6"<<endl
 16         <<"2 5 4 6 7 8"<<endl
 17         <<"5 8 9 7 4 6"<<endl
 18         <<"此为3行5列矩阵"<<endl<<endl;
 19     while(1)
 20     {
 21         cout<<"选择加法请按1"<<endl
 22             <<"选择减法请按2"<<endl
 23             <<"选择乘法请按3"<<endl
 24             <<"选择除法请按4"<<endl
 25             <<"结束程序请按0"<<endl;
 26         cin>>choice;
 27         if(choice==1)   add();
 28         else if(choice==2)  sub();
 29         else if(choice==3)  mul();
 30         else if(choice==4)  div();
 31         else if(choice==0)  break;
 32         else    cout<<"输入有误!请重新输入"<<endl;
 33     }
 34     return 0;
 35 }
 36 
 37 void add()
 38 {
 39     int n,m;
 40     double arr1[110][110]={0},arr2[110][110]={0},arr3[110][110]={0};
 41     cout<<"矩阵加法要求两个矩阵同型,请输入矩阵的行数和列数,用空格隔开:";
 42     cin>>n>>m;
 43     cout<<"您的第一个矩阵是:"<<endl;
 44     for(int i=0;i<n;i++)    for(int j=0;j<m;j++)    cin>>arr1[i][j];
 45     cout<<"第二个矩阵是:"<<endl;
 46     for(int i=0;i<n;i++)    for(int j=0;j<m;j++)    cin>>arr2[i][j];
 47     cout<<"两个矩阵相加的结果是:"<<endl;
 48     //计算与输出同时进行
 49     for(int i=0;i<n;i++)
 50     {
 51         for(int j=0;j<m;j++)
 52         {
 53             arr3[i][j]=arr1[i][j]+arr2[i][j];
 54             if(j!=0)    cout<<' ';
 55             cout<<arr3[i][j];
 56             if(j==m-1)  cout<<endl;
 57         }
 58     }
 59     cout<<endl;//格式美化
 60     return;
 61 }
 62 
 63 void sub()
 64 {
 65     int n,m;
 66     double arr1[110][110]={0},arr2[110][110]={0},arr3[110][110]={0};
 67     cout<<"矩阵减法要求两个矩阵同型,请输入矩阵的行数和列数,用空格隔开:";
 68     cin>>n>>m;
 69     cout<<"您的第一个矩阵是:"<<endl;
 70     for(int i=0;i<n;i++)    for(int j=0;j<m;j++)    cin>>arr1[i][j];
 71     cout<<"第二个矩阵是:"<<endl;
 72     for(int i=0;i<n;i++)    for(int j=0;j<m;j++)    cin>>arr2[i][j];
 73     cout<<"两个矩阵相减的结果是:"<<endl;
 74     //计算与输出同时进行,减少代码量
 75     for(int i=0;i<n;i++)
 76     {
 77         for(int j=0;j<m;j++)
 78         {
 79             arr3[i][j]=arr1[i][j]-arr2[i][j];
 80             if(j!=0)    cout<<' ';
 81             cout<<arr3[i][j];
 82             if(j==m-1)  cout<<endl;
 83         }
 84     }
 85     cout<<endl;//格式美化
 86     return;
 87 }
 88 
 89 void mul()
 90 {
 91     int n1,m1,n2,m2;
 92     double arr1[110][110]={0},arr2[110][110]={0},arr3[110][110]={0};
 93     cout<<"请输入第一个矩阵的行数和列数,用空格隔开:";
 94     cin>>n1>>m1;
 95     cout<<"请输入第二个矩阵的行数和列数,用空格隔开:";
 96     cin>>n2>>m2;
 97     if(m1!=n2)
 98     {
 99         cout<<"两矩阵无法相乘!"<<endl<<endl;
100         return;
101     }
102     cout<<"请输入第一个矩阵:"<<endl;
103     for(int i=0;i<n1;i++)   for(int j=0;j<m1;j++)   cin>>arr1[i][j];
104     cout<<"请输入第二个矩阵:"<<endl;
105     for(int i=0;i<n2;i++)   for(int j=0;j<m2;j++)   cin>>arr2[i][j];
106     cout<<"两矩阵相乘结果为:"<<endl;
107     //计算与输出同时进行,缩小代码量
108     for(int i=0;i<n1;i++)
109     {
110         for(int j=0;j<m2;j++)
111         {
112             for(int k=0;k<m1;k++)    arr3[i][j]+=arr1[i][k]*arr2[k][j];
113             if(j!=0)    cout<<' ';
114             cout<<arr3[i][j];
115             if(j==m2-1) cout<<endl;
116         }
117     }
118     cout<<endl;//格式美化
119     return;
120 }
121 
122 void div()
123 {
124     //本除法运用 A*E=E*(A逆) 原理
125     cout<<"注:矩阵相除要求除数矩阵必须是可逆方阵,请使用者输入正确的除数矩阵"<<endl;
126     int n1,m1,n2,m2;
127     double temp,arr1[110][110]={0},arr2[110][110]={0},arr3[110][110]={0},arr4[110][110]={0};
128     cout<<"请输入被除矩阵的行数和列数,用空格隔开:";
129     cin>>n1>>m1;
130     cout<<"请输入除数矩阵的行数和列数,用空格隔开:";
131     cin>>n2>>m2;
132     if(m1!=n2)
133     {
134         cout<<"两矩阵无法相除!"<<endl<<endl;
135         return;
136     }
137     cout<<"请输入被除矩阵:"<<endl;
138     for(int i=0;i<n1;i++)   for(int j=0;j<m1;j++)   cin>>arr1[i][j];
139     cout<<"请输入除数矩阵:"<<endl;
140     for(int i=0;i<n2;i++)   for(int j=0;j<m2;j++)   cin>>arr2[i][j];
141     //除数矩阵求逆处理
142     //创造E
143     for(int i=0;i<n2;i++)   for(int j=0;j<m2;j++)   if(i==j)    arr3[i][j]=1;
144     //默认A与E组成新的矩阵,对对角线进行化1,并从左下往右上分两部分化0
145     for(int k=0;k<n2;k++)
146     {
147         temp=arr2[k][k];
148         for(int i=0;i<m2;i++) //该行首位非0项化1
149         {
150             arr2[k][i]/=temp;
151             arr3[k][i]/=temp;
152         }
153         for(int i=k+1;i<n2;i++)
154         {
155             temp=arr2[i][k];
156             for(int j=0;j<m2;j++)
157             {
158                 arr2[i][j]-=temp*arr2[k][j];
159                 arr3[i][j]-=temp*arr3[k][j];
160             }
161         }
162     }
163     for(int k=n2-1;k>=0;k--)
164     {
165         temp=arr2[k][k];
166         for(int i=0;i>=0;i--)
167         {
168             arr2[k][i]/=temp;
169             arr3[k][i]/=temp;
170         }
171         for(int i=k-1;i>=0;i--)
172         {
173             temp=arr2[i][k];
174             for(int j=0;j<m2;j++)
175             {
176                 arr2[i][j]-=temp*arr2[k][j];
177                 arr3[i][j]-=temp*arr3[k][j];
178             }
179         }
180     }
181     cout<<"两矩阵相除结果为:"<<endl;
182     for(int i=0;i<n1;i++)
183     {
184         for(int j=0;j<m2;j++)
185         {
186             for(int k=0;k<m1;k++)    arr4[i][j]+=arr1[i][k]*arr3[k][j];
187             if(j!=0)    cout<<' ';
188             cout<<arr4[i][j];
189             if(j==m2-1) cout<<endl;
190         }
191     }
192     cout<<endl;//格式美化
193     return;
194 }

 

posted @ 2020-03-29 16:09  Conan-jine  阅读(960)  评论(0编辑  收藏  举报