SVD矩阵分解
这是我自己学习的有关SVD的代码,原理参考如下,我就不详细说,https://www.pianshen.com/article/1050296802/,主要利用LU分解原矩阵A,再求逆。
直接分享代码如下:
void SVD(double *A_Matrix,double *U_Matrix,double *V_Matrix,double *S_Matrix,int Row,int Col)
{
double *AT_Matrix = new double[Col * Row];
double *AAT_Matrix = new double[Row * Row];
double *ATA_Matrix = new double[Col * Col];
double *AAT_Egien_Vector = new double[Row * Row];
double *AAT_Egien_Value = new double[Row];
double *ATA_Egien_Vector = new double[Col * Col];
double *ATA_Egien_Value = new double[Col];
//求解转置矩阵
for (int i = 0; i < Row; ++i)
{
for (int j = 0; j < Col; ++j)
{
AT_Matrix[j*Row + i] = A_Matrix[i*Col + j];
}
}
//求解AAT=A*AT
for (int i = 0; i < Row; ++i)
{
for (int j = 0; j < Row; ++j)
{
double Ajk = 0;
for (int k = 0; k < Col; ++k)
{
Ajk += A_Matrix[i*Col + k] * AT_Matrix[k*Row + j];
}
AAT_Matrix[i*Row + j] = Ajk;
}
}
//求解ATA=AT*A
for (int i = 0; i < Col; ++i)
{
for (int j = 0; j < Col; ++j