欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-22 08:42:18
1 #include 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 ......
  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 }