c 版矩陣基本操作,行列式,逆(不限矩陣大小)

2021-07-31 06:34:22 字數 3217 閱讀 3504

原本是為了程式設計實現線性回歸的,想想,裡面太多矩陣操作,尤其是求逆。以前學數值分析時,也用到過列主元高斯消去求解線性方程組,lu分解求解線性方程組。這次,同樣是用高斯消去法求矩陣行列式的值,用lu分解求解矩陣的逆,效率上程式執行起來還行,比用python跑一邊速度快,結果一致,這也潛在說明python庫中矩陣求逆的實現應該也是用的lu分解。至於矩陣的其他一些操作,基本上算簡單,當然面的稀疏性矩陣的話,採用三元組的形式表示,運算起來會更好,但這裡不考慮,可以放到資料結構陣列的表示方式那一章中。下面給出c++實現的**

#include #include #include 

#include #include "loaddata.h"

#include #include #include using namespace std;

#define max_size_of_training_set 100

#define max_numit 100

#define attr_num 3

#define max 1000000

#define min -100000

#define max_matrix_col 1000

#define max_matrix_row 100

class matrix

p=p->next;

}matrix->row=dtm.row;

matrix->col=dtm.col;

return

0; }

int initmatrix(matrix *matrix,int col,int row)

return

0; }

int initmatrix(matrix *matrix,int col,int row,double lam)

}return

0; }

intprint(matrix matrix)

cout}

matrixb->col=matrixa.col;

matrixb->row=matrixa.row;

return

0; }

matrix getonerow(matrix matrix,int irow)

return onerow;

}matrix getonecol(matrix matrix,int icol)

return onecol;

}int deleteonerow(matrix *matrix,int irow)

matrix->row--;

}void transposematrix(matrix matrix,matrix *matrixt)//矩陣形式的轉置

//cout<}

}int addmatrix(matrix *addmatrix,matrix matrix1,matrix matrix2)

//cout<}

return

0; }

int submatrix(matrix *addmatrix,matrix matrix1,matrix matrix2)

//cout<}

return

0; }

int multsmatrix(matrix *multsmatrix,matrix matrix1,matrix matrix2)//矩陣形式的相乘

}for(i=0; ifor(j=0; jfor(k=0; kmat[i][j]+=matrix1.mat[i][k]*matrix2.mat[k][j];}}

}return

0; }

//行列式

double detmatrix(matrix matrix)

}//找到第k次列主元消去的最大行的下標

if(swap==-1||matrix.mat[swap][k]==0)

return -1;//最大主元為0

for(j=0; j//第k次消元,選出最大的一行是swap行,與第k行交換

for(i=k+1; i}

}for(i=0; icout<<"det="

}//高斯消元矩陣求逆,特別注意,lu分解不能進行行列式變換

int nimatrix(matrix *nimatrix,matrix matrix)}}

copy(matrix,&umatrix);

cout<<"umatrix"

for(j=0; jlmatrix.mat[i][j]=1/umatrix.mat[j][j]*(cpmatrix.mat[i][j]-temp);}}

for(i=0; ifor(j=0; jif(i==j)

lmatrix.mat[i][j]=1;

if(j>i)

lmatrix.mat[i][j]=0;}}

cout<<"lmatrix"

matrix multsmatrix;

multsmatrix.initmatrix(&multsmatrix,lmatrix.col,umatrix.row);

matrix.multsmatrix(&multsmatrix,lmatrix,umatrix);

cout<<"lu"

//計算u逆

for(j=0; jfor(i=j; i>=0; i--)

unimatrix.mat[i][j]=-1/umatrix.mat[i][i]*temp;}}

}cout<<"unimatrix"

//matrix multsmatrix;

//cout<<"multsmatrix"//計算l逆

for(j=0; jfor(i=0; iif(j==i)

lnimatrix.mat[i][j]=1;

else

lnimatrix.mat[i][j]=-temp;}}

}cout<<"lnimatrix"

multsmatrix(&multsmatrix,unimatrix,lnimatrix);

cout<<"luni"

//initmatrix(nimatrix,multsmatrix.col,multsmatrix.row);

copy(multsmatrix,nimatrix);

multsmatrix(&multsmatrix,cpmatrix,*nimatrix);

cout<<"luluni"

copy(cpmatrix,&matrix);

}};

行列式求值 矩陣求逆

include include include include include include include include using namespace std 動態分配大小位size的一維陣列 templatebool allocatememory1d t p,const int size ...

矩陣求逆及行列式求值

正在研究gtk 爭取盡快寫出帶有框體的程式,這個行列式的程式算是先寫著練練手,感受一下遞迴呼叫函式吧,應該算是dfs吧,寫起來實在是方便。2014.3.3修改 之前犯了很嚴重的錯誤,b maxnum maxnum 陣列放在complemet calculate函式內部,為自動變數,而返回的時候返回的...

C實現矩陣行列式計算

開始重新學習數學了,然而路途總是不那麼平坦,儘管是先挑選的最簡單的線性代數,然而一開始就進展不順 當然我承認數學一直都是乙個難以言說的傷痛,但是像什麼三階行列式計算還是老是算錯我就有點難以忍受了 於是編寫乙個程式解決行列式的計算問題,記得好像當初學線性代數的時候也想過程式設計實現,最終好像因為水平問...