#include<iostream>
#include<iomanip>
#include<fstream>
#include<string>
#include<stdlib.h>
using namespace std;
void main()
{
//ifstream inf("input.dat");
int A_N; //矩阵A的阶数
cout<<"请输入矩阵的阶数"<<endl;
cin>>A_N;
double **A_Matrix; //矩阵A
double **L_Matrix; //矩阵L
double **U_Matrix; //矩阵U
//cout<<"请输入矩阵A的行数和列数"<<endl;
//cout<<"阶数:"<<' ';
//A_N=4; //输入行数
A_Matrix=(double **)new double *[A_N];// 为矩阵A的行数动态分配空间
L_Matrix=(double **)new double *[A_N]; //为矩阵L的行数动态分配空间
U_Matrix=(double **)new double *[A_N]; //为矩阵U的行数动态分配空间
for(int i=0;i<A_N;i++)
{
A_Matrix[i]=new double[A_N]; //为矩阵A的每一列动态分配空间
L_Matrix[i]=new double[A_N]; //为矩阵L的每一列动态分配空间
U_Matrix[i]=new double[A_N]; //为矩阵U的每一列动态分配空间
}
cout<<"请按行优先的顺序输入矩阵A"<<endl;
for(int i=0;i<A_N;i++)
{
for(int j=0;j<A_N;j++)
{
cin>>A_Matrix[i][j]; //矩阵输入
}
}
//cout<<"请以行优先的顺序输入"<<endl;
// for( i=0;i<A_N;i++)
// {
//cout<<"请输入第"<<i<<"行"<<endl;
//for(int j=0;j<A_N;j++)
/* int i=0; //{
while(!inf.eof())
{
char *s1,*s2,*s3,*s4;//声明字符
s1=new char[4]; //动态分配内存
s2=new char[4];
s3=new char[4];
s4=new char[4];
s5=new char[2];
inf>>s1>>s2>>s3>>s4;//将文件input.dat中的数据存入字符
A_Matrix[i][0]=atof(s1);//将读取到的字符转换为double类型
A_Matrix[i][1]=atof(s2);
A_Matrix[i][2]=atof(s3);
A_Matrix[i][3]=atof(s4);
A_Matrix[i][4]=atof(s5);
i++;
}
inf.close();*/
//输入矩阵A
//}
// }
for(int i=0;i<A_N;i++)
{
U_Matrix[0][i]=A_Matrix[0][i]; //容易看出A和U的第一行元素对应相等
for(int j=i+1;j<A_N;j++) //U矩阵的下三角为0;
{
U_Matrix[j][i]=0;
}
}
for(int i=0;i<A_N;i++)
{
L_Matrix[i][0]=A_Matrix[i][0]/U_Matrix[0][0];//矩阵L为单位下三角矩阵
//且L的第一列为矩阵A的第一列除以U的第一个元素
L_Matrix[i][i]=1; //主对角线为1;
for(int j=i+1;j<A_N;j++) //L矩阵的上三角为0
{
L_Matrix[i][j]=0;
}
}
for(int k=1;k<A_N;k++) //推理:已知U的前k-1行和L的前k-1列求U的第k行元素和L的第k列元素
{
for(int j=k,i=k+1;j<A_N;j++,i++)
{
double U_Sum=0;
double L_Sum=0;
for(int s=0;s<=k-1;s++)
{
U_Sum+=L_Matrix[k][s]*U_Matrix[s][j];
}
U_Matrix[k][j]=A_Matrix[k][j]-U_Sum;
if(j==A_N-1)break;
for(int s=0;s<=k-1;s++)
{
L_Sum+=L_Matrix[i][s]*U_Matrix[s][k];
}
L_Matrix[i][k]=(A_Matrix[i][k]-L_Sum)/U_Matrix[k][k];
}
}
for(int i=0;i<A_N;i++) //输出L矩阵
{
for(int j=0;j<A_N;j++)
{
cout<<std::left<<setw(10)<<L_Matrix[i][j]<<' ';
}
cout<<'
';
}
cout<<'
';
cout<<'
';
for(int i=0;i<A_N;i++) //输出U矩阵
{
for(int j=0;j<A_N;j++)
{
cout<<std::left<<setw(10)<<U_Matrix[i][j]<<' ';
}
cout<<'
';
}
system("pause");
}