C++實現(xiàn)線性代數(shù)矩陣行簡化
更新時間:2020年02月03日 11:53:39 作者:MrTinTin
這篇文章主要為大家詳細介紹了C++實現(xiàn)線性代數(shù)矩陣行簡化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C++實現(xiàn)線性代數(shù)矩陣行簡化的具體代碼,供大家參考,具體內容如下
輸入一個矩陣,可分別輸出該矩陣的階梯型和最簡型。
輸入僅支持整數(shù),支持分數(shù)形式輸出。
媽媽再也不用擔心俺的線性代數(shù)作業(yè)~
使用實例:
(實現(xiàn)格式化輸出部分寫的極為丑陋......)
#include<iostream> #include<cmath> #include<algorithm> #include<iomanip> #include<cstdio> #include<string> #define f(i,l,r) for(i=(l);i<=(r);i++) #define ff(i,r,l) for(i=(r);i>=(l);i--) #define ll long long #define EPS 1e-6 using namespace std; const int MAXN=105; int n,m; char output[MAXN]; string s; struct frac{ int x,y=1; bool operator < (const frac &tmp)const{ return 1.0*x/y<1.0*tmp.x/tmp.y; } frac operator - (const frac &tmp){ frac ans; ans.x=x*tmp.y-y*tmp.x; ans.y=y*tmp.y; ans.sim(); return ans; } frac operator * (const frac &tmp){ frac ans; ans.x=x*tmp.x; ans.y=y*tmp.y; ans.sim(); return ans; } frac operator / (const frac &tmp){ frac ans; ans.x=x*tmp.y; ans.y=y*tmp.x; ans.sim(); return ans; } int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } void sim(){ int d=gcd(x,y); x/=d; y/=d; if(x<0&&y<0){ x=-x; y=-y; } } void write() { int i; char tmp[MAXN]; int num=0; int nx=x,ny=y; s=""; if(!nx){ s+="0"; } else{ if(nx<0||ny<0){ s+='-'; nx=abs(nx); ny=abs(ny); } if(nx%ny==0){ nx/=ny; while(nx){ tmp[++num]='0'+nx%10; nx/=10; } ff(i,num,1){ s+=tmp[i]; } } else{ while(nx){ tmp[++num]='0'+nx%10; nx/=10; } ff(i,num,1){ s+=tmp[i]; } s+='/'; num=0; while(ny){ tmp[++num]='0'+ny%10; ny/=10; } ff(i,num,1){ s+=tmp[i]; } } } f(i,s.length(),7){ cout<<" "; } cout<<s; } }a[MAXN][MAXN]; void out_f() { int i,j; f(i,1,n){ f(j,1,m){ cout<<1.0*a[i][j].x/a[i][j].y<<" "; } cout<<endl; } } void out() { int i,j; f(i,1,n){ f(j,1,m){ a[i][j].write(); cout<<" "; } cout<<endl; } } int find(int r,int c) { int i,t=-1; f(i,r,n){ if(t==-1||a[t][c]<a[i][c]) t=i; } return t; } void interchange(int r1,int r2) { int j; f(j,1,m){ swap(a[r1][j],a[r2][j]); } return; } void scale(int r,int c) { int j; ff(j,m,c){ a[r][j]=a[r][j]/a[r][c]; } return; } void muilt(int r,int c) { int i,j; f(i,r+1,n){ if(!a[i][c].x) continue; ff(j,m,c){ a[i][j]=a[i][j]-(a[i][c]*a[r][j]); } } return; } void gause_1() { int c,r=1; f(c,1,n){ int pos=find(r,c); if(!a[pos][c].x) continue; interchange(r,pos); scale(r,c); muilt(r,c); r++; } } void gause_2() { int i,j; ff(i,n,1){ f(j,i+1,n){ a[i][n+1]=a[i][n+1]-(a[i][j]*a[j][n+1]); a[i][j].x=0; } } return; } int main() { int i,j; cout<<"輸入矩陣的行數(shù)和列數(shù):"<<endl; cin>>n>>m; cout<<"輸入矩陣元素:"<<endl; f(i,1,n){ f(j,1,m){ cin>>a[i][j].x; } } gause_1(); cout<<"階梯型為:"<<endl; out(); gause_2(); cout<<"最簡型為:"<<endl; out(); return 0; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C語言編程gcc如何生成靜態(tài)庫.a和動態(tài)庫.so示例詳解
本文主要敘述了gcc如何生成靜態(tài)庫(.a)和動態(tài)庫(.so),幫助我們更好的進行嵌入式編程。因為有些時候,涉及安全,所以可能會提供靜態(tài)庫或動態(tài)庫供我們使用2021-10-10