# include & ltiostream & gt
# include & ltcstdlib & gt
# include & ltcstdio & gt
# include & ltcmath & gt
# include & ltcstring & gt
使用命名空間std
類別行列式
{
公共:
行列式()
{
int i,j;
side lenth = 2;
array = new double *[side lenth];
for(I = 0;我& lt側面長度;i++)
{
array[I]= new double[side lenth];
}
for(I = 0;我& lt側面長度;i++)
{
for(j = 0;j & lt側面長度;j++)
{
array[I][j]= 0;
}
}
}
行列式(整數倍)
{
int i,j;
這-& gt;sideLenth = sideLenth
array = new double *[side lenth];
for(I = 0;我& lt側面長度;i++)
{
array[I]= new double[side lenth];
}
for(I = 0;我& lt側面長度;i++)
{
for(j = 0;j & lt側面長度;j++)
{
array[I][j]= 0;
}
}
}
~行列式()
{
for(int I = 0;我& lt側面長度;i++)
{
刪除[]數組[I];
}
刪除[]數組;
}
void set determinant();
double calculate();
double等號();
雙* *陣;
int getsideLenth();
double calCofactor(int m,int n);//m是水平刻度,n是垂直刻度。
void show();//用於測試
受保護:
int sideLenth
私人:
double cal two();
無效拷貝(行列式& ampforCal);
void exchangeCorOrRow(行列式& ampforCal,int m,int n,bool colorrow);
};
int行列式::getsideLenth()
{
返回側面長度;
}
void行列式::setdeterminant()
{
for(int j = 0;j & lt側面長度;j++)
{
for(int I = 0;我& lt側面長度;i++)
{
CIN & gt;& gtarray[I][j];
}
}
}
雙重行列式::calculate()
{
if(邊長==2)
{
返回cal two();
}
雙結果= 0.0;
for(int I = 0;我& lt側面長度;i++)
{
result+=calCofactor(i,0)* array[I][0];
}
返回結果;
}
雙重行列式::calCofactor(int m,int n)
{
int yi=0,yj = 0;
int I;
行列式yzs(sideLenth-1);
for(I = 0;我& lt側面長度;i++)
{
如果(我!=m)
{
for(int j = 0;j & lt側面長度;j++)
{
如果(j!=n)
yzs . array[yi][yj++]= array[I][j];
}
yi++;
yj = 0;
}
}
double tmp = yzs . calculate();
if((m+n)%2==1)
tmp =-tmp;
返回tmp
}
雙重行列式::caltwo()
{
如果(sideLenth!=2)
{
cout & lt& lt“錯誤!”& lt& ltendl
返回0.0;
}
其他
{
返回數組[0][0]*數組[1][1]-數組[0][1]*數組[1][0];
}
}
雙重行列式::equal()
{
if(sideLenth & lt;4)
{
返回calculate();
}
行列式forCal(邊長);
副本(for cal);
bool b = true
for(int I = 0;我& ltsideLenth-1;I++)//i是需要三角化的列。
{
if(forCal.array[i][i]==0)
{
for(int k = I+1;k & lt側面長度;k++)
{
if(forCal.array[k][i]!=0)
{
exchange corrow(for cal,I,k,true);
b=!b;
打破;
}
}
if(k = =邊長)
返回0;
}
for(int j = I+1;j & lt側面長度;J++)//j是需要三角剖分的線。
{
if(forCal.array[i][j]!=0)
{
double times = forcal . array[I][j]/forcal . array[I][I];
for(int k = I;k & lt側面長度;k++)
{
for cal . array[k][j]-=(for cal . array[k][I]* times);
}
}
}
}
雙結果= 1;
for(I = 0;我& lt側面長度;i++)
{
result * = forcal . array[I][I];
}
如果(!b)結果=-結果;
返回結果;
}
void行列式::復制(行列式& ampforCal)
{
int i,j;
if(forCal.sideLenth!=側面長度)
{
cout & lt& lt"尺寸不同,無法復制"
返回;
}
for(I = 0;我& lt側面長度;i++)
{
for(j = 0;j & lt側面長度;j++)
{
forcal . array[I][j]= array[I][j];
}
}
}
void行列式::exchangeCorOrRow(行列式& ampforCal,int m,int n,bool colorrow)
{
雙溫;
如果(m & gt= sideLenth | | n & gt= sideLenth | | m & lt0 | | n & lt0)
{
cout & lt& lt"參數錯誤"
返回;
}
If(colorrow)//true是交換列。
{
for(int I = 0;我& lt側面長度;i++)
{
temp = forcal . array[I][m];
for cal . array[I][m]= for cal . array[I][n];
forcal . array[I][n]= temp;
}
}
否則//false是交換行。
{
for(int I = 0;我& lt側面長度;i++)
{
temp = forcal . array[m][I];
for cal . array[m][I]= for cal . array[n][I];
forcal . array[n][I]= temp;
}
}
}
void行列式::show()
{
for(int I = 0;我& lt側面長度;i++)
{
for(int j = 0;j & lt側面長度;j++)
{
printf("%-6.2lf ",array[j][I]);
}
printf(" \ n ");
}
}
類別矩陣
{
私人:
int行;//線標簽的最大值
int col//列標簽的最大值
void copyToDeterminant(行列式& amp目的地);
void equalConvers(int rs,int rd,int cs,double factor);
void divider row(int r,int cs,double factor);
void exchangerow(int rs,int rd);
公共:
雙* *陣;
matrix(){ row = 0;col = 0;}
void setArray();//初始化二維數組
matrix(int row,int col);
~ matrix();
void set matrix();//給矩陣賦值
void show();
void inverse();
虛空運();
朋友無效乘法(矩陣& amp結果,常數矩陣和。faciend,常數矩陣& amp乘數);
int stairlize(int start,int end);
int getrow(){ return row;}
int getcol(){ return col;}
};
void matrix::setArray()
{
int i,j;
array = new double *[row];
for(I = 0;我& lt排;i++)
{
array[I]= new double[col];
}
for(I = 0;我& ltcoli++)
{
for(j = 0;j & lt排;j++)
{
array[j][I]= 0;
}
}
}
matrix::matrix(int row,int col)
{
這-& gt;row = row
這-& gt;col = col
setArray();
}
矩陣::~矩陣()
{
int I;
for(I = 0;我& lt排;i++)
{
刪除[]數組[I];
}
刪除[]數組;
array = NULL
}
void matrix::setmatrix()
{
if(row==0||col==0)
{
拋出“矩陣未初始化\ n”;
}
int i,j;
for(I = 0;我& ltcoli++)
{
for(j = 0;j & lt排;j++)
{
scanf("%lf ",& amparray[j][I]);
}
}
}
void matrix::show()
{
int i,j;
for(I = 0;我& ltcoli++)
{
for(j = 0;j & lt排;j++)
{
printf("%.2lf ",array[j][I]);
}
printf(" \ n ");
}
}
空隙倍增(矩陣& amp結果,常數矩陣和。faciend,常數矩陣& amp乘數)
{
if(faciend.row!=multiplicator.col)
拋出“左矩陣的列數必須等於右矩陣的行數\ n”;
result . row = multiplicator . row;
result . col = faciend . col;
result . set array();
int times = faciend.row
int m,n,I;
for(n = 0;n & lt結果. row;n++)
{
for(m = 0;m & lt結果. col;m++)
{
雙結果數= 0.0;
for(I = 0;我& lt時代;i++)
{
result number+= faciend . array[I][m]* multiplier . array[n][I];
}
result . array[n][m]=結果編號;
}
}
}
void矩陣::copyToDeterminant(行列式& amp目的地)
{
如果(排!=列)
Throw“只有當矩陣的行數和列數相等時才能復制到行列式中\ n”;
如果(排!=destination.getsideLenth())
拋出“行列式大小與矩陣不匹配\ n”;
int i,j;
for(I = 0;我& lt排;i++)
{
for(j = 0;j & ltcolj++)
{
destination . array[I][j]= array[I][j];
}
}
}
void矩陣::運輸()
{
如果(排!=列)
拋出“僅當矩陣的行數和列數相等時可逆\ n”;
行列式tmp determinant(row);
copyToDeterminant(tmpDeterminant);
double value = tmpdeterminant . equal();
如果(值==0)
{
Printf("行列式的值是%lf,所以矩陣是不可逆的\n ",value);
返回;
}
int i,j;
for(I = 0;我& lt排;i++)
{
for(j = 0;j & ltcolj++)
{
array[j][I]= tmp determinant . calco factor(I,j)/value;
}
}
}
void矩陣::inverse()
{
int i,j;
for(I = 0;我& ltcol-1;I++)//縱坐標
{
for(j = I+1;我& lt排;I++)//橫幅
{
double tmp = array[j][I];
array[j][I]= array[I][j];
array[I][j]= tmp;
}
}
}
Voidmatrix:: equal convers (int RS,int rd,int cs,double factor)//RS是起始行標記ds,目標行cs和起始列。
{
for(int I = cs;我& lt排;i++)
{
array[I][rd]-= array[I][RS]*因子;
//printf(" array[% d][% d]= % . 2 lf ",I,rd,array[I][rd]);
}
//printf(" \ n ");
}
void matrix::exchangerow(int rs,int rd)
{
for(int I = 0;我& lt排;i++)
{
雙tmp
tmp = array[I][RS];
數組[I][RS]=數組[I][rd];
array[I][rd]= tmp;
}
}
void matrix::divideRow(int r,int cs,double factor)
{
for(int I = cs;我& lt排;i++)
{
array[I][r]/= factor;
}
}
int matrix::stairlize(int start,int end)
{
int i,j;
雙重因素;
int R = 0;
if(start & lt;0 | | end & gt= row | | start & gt結束)
{
cout & lt& lt"不正確的傳入參數"
返回0;
}
for(I = start;我& lt=結束;I++)//是橫幅。
{
if(array[R][i]==0)
{
int k;
for(k = R+1;k & ltcolk++)
{
if(數組[i][k])
{
exchangerow(i,k);
打破;
}
}
if(k==col)
{
繼續;
}
}
for(j = 0;j & ltcolj++)
{
if(array[I][j]& amp;& ampj!=R)
{
因子= array[I][j]/array[I][R];
equalConvers(R,j,I,factor);
}
}
r++;
}
for(I = 0;我& lt= R;i++)
{
for(j = I;j & lt排;j++)
{
if(array[j][i])
{
divideRow(i,j,array[j][I]);
打破;
}
}
}
return R;
}
void main()
{
cout & lt& lt"請選擇您要執行的操作"
cout & lt& lt"1.決定因素評估”
cout & lt& lt"2.矩陣乘法”
cout & lt& lt"3.矩陣的逆矩陣”
cout & lt& lt"4.矩陣轉置”
cout & lt& lt"5.步驟類型" < & ltendl
cout & lt& lt"0.退出程序"
int選擇;
而(CIN & gt;& gt選擇)
{
開關(選擇)
{
案例1:
{
int大小;
cout & lt& lt"請輸入要計算的行列式的維數"
CIN & gt;& gt尺寸;
行列式jz(大小);
JZ . set determinant();
Printf("這個行列式的值是%.2lf\n ",JZ . equal());
打破;
}
案例二:
{
int rc,col,row//rc是矩陣A的行和列的最大值,col是矩陣A的列的最大值,row是矩陣b的行的最大值。
cout & lt& lt請輸入矩陣A的行數和矩陣B的列數、矩陣A的列數和矩陣B的行數的最大值
CIN & gt;& gtrc & gt& gtcol & gt& gt排;
矩陣A(rc,col);
矩陣B(row,RC);
cout & lt& lt"請給矩陣A賦值"
a . set matrix();
cout & lt& lt"請給矩陣b賦值"
b . set matrix();
矩陣C;
乘法(C,A,B);
c . show();
打破;
}
案例三:
{
int大小;
cout & lt& lt"請輸入正方形的大小"
CIN & gt;& gt尺寸;
矩陣求逆(大小,大小);
inversing . set matrix();
inversing . transportation();
inversing . show();
打破;
}
案例4:
{
int大小;
cout & lt& lt"請輸入正方形的大小"
CIN & gt;& gt尺寸;
矩陣求逆(大小,大小);
inversing . set matrix();
inversing . inverse();
inversing . show();
打破;
}
案例5:
{
int m,n,R;
cout & lt& lt"請分別輸入矩陣的列數和行數"
CIN & gt;& gtm & gt& gtn;
矩陣求逆(m,n);
inversing . set matrix();
R=inversing.stairlize(0,m-1);
cout & lt& lt“矩陣的秩是”
inversing . show();
打破;
}
案例0:
退出(0);
打破;
}
cout & lt& lt"請選擇新的計算類型"
}
}
/*
五
5 4
1 -2 2 -1 1
2 -4 8 0 2
-2 4 -2 3 3
3 -6 0 -6 4
*/