原本是為了程式設計實現線性回歸的,想想,裡面太多矩陣操作,尤其是求逆。以前學數值分析時,也用到過列主元高斯消去求解線性方程組,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實現矩陣行列式計算
開始重新學習數學了,然而路途總是不那麼平坦,儘管是先挑選的最簡單的線性代數,然而一開始就進展不順 當然我承認數學一直都是乙個難以言說的傷痛,但是像什麼三階行列式計算還是老是算錯我就有點難以忍受了 於是編寫乙個程式解決行列式的計算問題,記得好像當初學線性代數的時候也想過程式設計實現,最終好像因為水平問...