这是我编的一个简易矩阵计算器,C++语言,非常容易理解的,你可以参考求行列式和逆部分#include <iostream>#include <iomanip>#include <conio.h>#include "windows.h"#include <string>using namespace std;void gotoxy(int x,int y) // 列x: 0~79 行y: 0~24 { HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE); COORD coordScreen={x,y}; SetConsoleCursorPosition(hConsole,coordScreen); return; } void setcolor(unsigned short ForeColor,unsigned short BackColor) // 0--黑 1--暗蓝 2--暗绿 3--暗青 4--暗红 5--暗紫 6--蟹黄 7--暗白 // 8--灰 9--亮蓝 10-亮绿 11-亮青 12-亮红 13-亮紫 14-黄 15-亮白{ HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hCon,(ForeColor % 16)|(BackColor % 16 * 16));};int main(){ void plu(); void sub(); void amo(); void mul(); void ran(); void ord(); char sel='1'; while(sel != '0') { int i; system("cls"); // 清屏 setcolor(15,0); // 下面显示黑底亮青字 gotoxy(8,1); cout<<"┌───────────────────────────┐"; for(i=2;i<20;i++) {gotoxy(8,i);cout<<"│";gotoxy(64,i);cout<<"│";} setcolor(15,6); // 下面显示红底白字 gotoxy(10,3); cout<<" "; gotoxy(10,4); cout<<" 简 易 矩 阵 计 算 器 "; gotoxy(10,5); cout<<" "; setcolor(15,0); // 下面显示黑底亮青字 gotoxy(10,7); cout<<" 1 ---- 矩阵加法 2 ---- 矩阵减法 "; gotoxy(10,9); cout<<" 3 ---- 矩阵数乘 4 ---- 矩阵乘法 "; gotoxy(10,11); cout<<" 5 ---- 矩阵行列式 6 ---- 矩阵的逆 "; gotoxy(10,13); cout<<" 0 ---- 退出 "; gotoxy(10,15); cout<<" 请选择(0--6):"; gotoxy(8,20); cout<<"└───────────────────────────┘"; do { gotoxy(28,15); sel=getche( );} while ( sel!='1' && sel!='2' && sel!='3' && sel!='4' && sel!='5' && sel!='6'&& sel!='0'); switch(sel) { case '1':plu(); break; case '2':sub(); break; case '3':amo(); break; case '4':mul(); break; case '5':ran(); break; case '6':ord(); break; case '0': break; } } system("cls"); gotoxy(25,10); cout<<"谢 谢 使 用 系 统 !"<<endl; return 0;}void plu()//加法{ char l; system("cls"); // 清屏 setcolor(14,0); // 下面用黑底黄字 int a,b,i,j; gotoxy(0,0);cout<<">>>>>> 矩阵加法 "; gotoxy(0,2);cout<<"请输入矩阵的行数:"; cin>>a; cout<<endl; cout<<"请输入矩阵的列数:"; cin>>b; cout<<endl; double m[10][10],n[10][10]; cout<<"请输入第一个矩阵:"<<endl; for(i=0;i<a;i++) for(j=0;j<b;j++) {gotoxy(6*j+20,2*i+6); cin>>m[i][j];} cout<<endl<<endl<<"请输入第二个矩阵:"<<endl; for(i=0;i<a;i++) for(j=0;j<b;j++) {gotoxy(6*j+20,2*a+2*i+7);cin>>n[i][j];} cout<<endl<<">>>>>>>"<<endl<<"矩阵加法结果为:"; for(i=0;i<a;i++) for(j=0;j<b;j++) {gotoxy(6*j+20,4*a+2*i+8);cout<<m[i][j]+n[i][j];} gotoxy(0,6*a+9); cout<<">>>>>>>>按任意键退出:"; l=getche();}void sub()//减法{ char l; system("cls"); // 清屏 setcolor(14,0); // 下面用黑底黄字 int a,b,i,j; gotoxy(0,0);cout<<">>>>>矩阵减法"; gotoxy(0,2);cout<<"请输入矩阵的行数:"; cin>>a; cout<<endl; cout<<"请输入矩阵的列数:"; cin>>b; cout<<endl; double m[10][10],n[10][10]; cout<<"请输入第一个矩阵:"<<endl; for(i=0;i<a;i++) for(j=0;j<b;j++) {gotoxy(6*j+20,2*i+6); cin>>m[i][j];} cout<<endl<<endl<<"请输入第二个矩阵:"<<endl; for(i=0;i<a;i++) for(j=0;j<b;j++) {gotoxy(6*j+20,2*a+2*i+7);cin>>n[i][j];} cout<<endl<<">>>>>>>"<<endl<<"矩阵减法结果为:"; for(i=0;i<a;i++) for(j=0;j<b;j++) {gotoxy(6*j+20,4*a+2*i+8);cout<<m[i][j]-n[i][j];} gotoxy(0,6*a+9); cout<<">>>>>>>>按任意键退出:"; l=getche();}void amo()//数乘{ char h; system("cls"); // 清屏 setcolor(14,0); // 下面用黑底黄字 int a,b,i,j; gotoxy(0,0);cout<<">>>>>>矩阵数乘"; gotoxy(0,2);cout<<"请输入矩阵的行数:"; cin>>a; cout<<endl; cout<<"请输入矩阵的列数:"; cin>>b; cout<<endl; double m[10][10],c; cout<<"请输入矩阵:"<<endl; for(i=0;i<a;i++) for(j=0;j<b;j++) {gotoxy(6*j+20,2*i+6);cin>>m[i][j];} cout<<endl<<"请输入与矩阵相乘的实数:"; cin>>c; cout<<endl<<endl<<"矩阵数乘结果为:"; for(i=0;i<a;i++) for(j=0;j<b;j++) {gotoxy(8*j+20,2*a+2*i+9);cout<<m[i][j]*c;} gotoxy(0,4*a+12); cout<<">>>>>>>按任意键退出:";h=getche();}void mul()//乘法{ char k; system("cls"); // 清屏 setcolor(14,0); // 下面用黑底黄字 int a,b,c,i,j,q; gotoxy(0,0);cout<<">>>>>>矩阵乘法"; gotoxy(0,2);cout<<"请输入第一个矩阵的行数:"; cin>>a; cout<<endl<<"请输入第一个矩阵的列数:"; cin>>b; cout<<endl<<"则第二个矩阵的行数也为:"<<b; cout<<endl<<endl<<"请输入第二个矩阵的列数:"; cin>>c; cout<<endl; double m[10][10],n[10][10],p[10][10]={0}; cout<<"请输入第一个矩阵:"<<endl; for(i=0;i<a;i++) for(j=0;j<b;j++) {gotoxy(6*j+18,2*i+10); cin>>m[i][j];} cout<<endl<<endl<<"请输入第二个矩阵:"; for(i=0;i<b;i++) for(j=0;j<c;j++) {gotoxy(6*j+18,2*a+2*i+11);cin>>n[i][j];} cout<<endl<<">>>>>>>"<<endl<<"矩阵相乘结果为: "; for(i=0;i<a;i++) for(j=0;j<c;j++) for(q=0;q<b;q++) p[i][j]=p[i][j]+m[i][q]*n[q][j]; for(i=0;i<a;i++) for(j=0;j<c;j++) {gotoxy(10*j+18,2*a+2*b+2*i+12);cout<<p[i][j];} gotoxy(16,2*a+2*b+2*i+15); cout<<">>>>>>>按任意键退出:";k=getche();}//===================================================行列式float Fun(int n1,float a1[10][10]);void ran(){ system("cls"); // 清屏 setcolor(15,0); // 下面用黑底黄字 char k; int n,i,j; cout<<">>>>>矩阵行列式"<<endl<<endl<<"请输入矩阵阶数: "; cin>>n; cout<<endl<<"请输入矩阵:"<<endl; float a[10][10]; for(i=0;i<n;i++) for(j=0;j<n;j++) {gotoxy(6*j+12,2*i+4);cin>>a[i][j];} cout<<endl<<"行列式为: "<<Fun(n,a)<<endl<<endl; cout<<">>>>>>按任意键退出:"; k=getche(); }float Fun(int n1,float a1[10][10])//求行列式的递归函数{ int i_1,j_1,c;//c为数组b的行 float b[10][10]; int p=0,q=0; float sum=0; if(n1==1) return a1[0][0]; for(i_1=0;i_1<n1;i_1++) { for(c=0;c<n1-1;c++) {if(c<i_1) p=0; else p=1; for(j_1=0;j_1<n1-1;j_1++) {b[c][j_1]=a1[c+p][j_1+1];} } if(i_1%2==0) q=1; else q=(-1); sum=sum+a1[i_1][0]*q*Fun(n1-1,b); }return sum;}//================================================================void ord(){ char g; system("cls"); // 清屏 setcolor(15,0); // 下面用黑底黄字 int i,j,n; gotoxy(0,0);cout<<">>>>>矩阵的逆"; gotoxy(0,2);cout<<"请输入矩阵的阶数:"; cin>>n; cout<<endl; cout<<"请输入矩阵:"; float l[10][10],m[10][10],p; for(i=0;i<n;i++) for(j=0;j<n;j++) {gotoxy(4*j+12,2*i+4); cin>>l[i][j];} if(Fun(n,l)==0) cout<<endl<<"该矩阵无逆!!!"<<endl; else {p=Fun(n,l); cout<<endl<<"矩阵的逆为: "; for(i=0;i<n;i++) for(j=0;j<n;j++) {{float f[10][10]; int r,w,e,d;//e为数组f的行数 for(int j_1=0,e=0;j_1<n-1,e<n-1;j_1++,e++) for(int i_1=0,d=0;i_1<n-1,d<n-1;i_1++,d++) {if(e<i) r=0;else r=1; if(d<j) w=0;else w=1; f[i_1][j_1]=l[i_1+w][j_1+r];}; if((i+j)%2==0) m[i][j]=Fun(n-1,f)/p; else m[i][j]=-Fun(n-1,f)/p; }; gotoxy(9*j+12,2*n+2*i+4);cout<<m[i][j];};}; cout<<endl<<endl<<">>>>>>按任意键退出:";g=getche();}
下面是实现Gauss-Jordan法实矩阵求逆。 #include <stdlib.h> #include <math.h> #include <stdio.h> int brinv(double a[], int n) { int *is,*js,i,j,k,l,u,v; double d,p; is=malloc(n*sizeof(int)); js=malloc(n*sizeof(int)); for (k=0; k<=n-1; k++) { d=0.0; for (i=k; i<=n-1; i++) for (j=k; j<=n-1; j++) { l=i*n+j; p=fabs(a[l]); if (p>d) { d=p; is[k]=i; js[k]=j;} } if (d+1.0==1.0) { free(is); free(js); printf("err**not inv\n"); return(0); } if (is[k]!=k) for (j=0; j<=n-1; j++) { u=k*n+j; v=is[k]*n+j; p=a[u]; a[u]=a[v]; a[v]=p; } if (js[k]!=k) for (i=0; i<=n-1; i++) { u=i*n+k; v=i*n+js[k]; p=a[u]; a[u]=a[v]; a[v]=p; } l=k*n+k; a[l]=1.0/a[l]; for (j=0; j<=n-1; j++) if (j!=k) { u=k*n+j; a[u]=a[u]*a[l];} for (i=0; i<=n-1; i++) if (i!=k) for (j=0; j<=n-1; j++) if (j!=k) { u=i*n+j; a[u]=a[u]-a[i*n+k]*a[k*n+j]; } for (i=0; i<=n-1; i++) if (i!=k) { u=i*n+k; a[u]=-a[u]*a[l];} } for (k=n-1; k>=0; k--) { if (js[k]!=k) for (j=0; j<=n-1; j++) { u=k*n+j; v=js[k]*n+j; p=a[u]; a[u]=a[v]; a[v]=p; } if (is[k]!=k) for (i=0; i<=n-1; i++) { u=i*n+k; v=i*n+is[k]; p=a[u]; a[u]=a[v]; a[v]=p; } } free(is); free(js); return(1); } void brmul(double a[], double b[],int m,int n,int k,double c[]) { int i,j,l,u; for (i=0; i<=m-1; i++) for (j=0; j<=k-1; j++) { u=i*k+j; c[u]=0.0; for (l=0; l<=n-1; l++) c[u]=c[u]+a[i*n+l]*b[l*k+j]; } return; } int main() { int i,j; static double a[4][4]={ {0.2368,0.2471,0.2568,1.2671}, {1.1161,0.1254,0.1397,0.1490}, {0.1582,1.1675,0.1768,0.1871}, {0.1968,0.2071,1.2168,0.2271}}; static double b[4][4],c[4][4]; for (i=0; i<=3; i++) for (j=0; j<=3; j++) b[i][j]=a[i][j]; i=brinv(a,4); if (i!=0) { printf("MAT A IS:\n"); for (i=0; i<=3; i++) { for (j=0; j<=3; j++) printf("%13.7e ",b[i][j]); printf("\n"); } printf("\n"); printf("MAT A- IS:\n"); for (i=0; i<=3; i++) { for (j=0; j<=3; j++) printf("%13.7e ",a[i][j]); printf("\n"); } printf("\n"); printf("MAT AA- IS:\n"); brmul(b,a,4,4,4,c); for (i=0; i<=3; i++) { for (j=0; j<=3; j++) printf("%13.7e ",c[i][j]); printf("\n"); } } }参考资料:C常用算法程序集-徐士良