矩阵分解之LU

分享我这几天整理的代码
原理参考如下:https://blog.csdn.net/u010945683/article/details/45803141

直接上代码,注释部分是求解线性方程的

void LU_Decom(double *matrix, double *L,double *U, double *b,int order)
{
	for (int i = 0; i < order; ++i)
	{
		for (int j = 0; j < i; ++j)
		{
			*(U + i*order + j) = 0;
		}//初始化U的下三角为0

		*(L + i*order + i) = 1;//初始化L的对角线为1

		for (int j = i + 1; j < order; ++j)
		{
			*(L + i*order + j) = 0;
		}//初始化L的上三角为0
	}
	for (int i = 0; i < order; ++i)
	{
		*(U + i) = *(matrix + i);
	}//计算U的第一行

	for (int i = 1; i < order; i++)
	{
		*(L + i*order) = *(matrix + i * order) / *U;
		//*(L + i * order) = *(matrix + i * order);
	}/
	float temp;
	for (int i = 1; i < order; ++i)
	{
		for (int j = i; j < order; ++j)
		{   
			temp = 0;
			for (int k = 0; k < i; ++k)
			{
				//cout << *(U + k*order + j) << ' ' << *(L + i*order + k) << endl;
				temp += (*(U + k * order + j) * (*(L + i * order + k)));;
			}

			*(U + i*order + j) = *(matrix + i*order + j) - temp;
		}//计算U的其他行
		for (int j = i + 1; j < order; ++j)
		{
			temp = 0;
			for (int k = 0; k < i; ++k)
			{
				temp += *(U + k*order + i)*(*(L + j*order + k));
			}
			*(L + j*order + i) = (*(matrix + j*order + i) - temp) / (*(U + i*order + i));
		}//计算L的其他行
	}
	//求解线性方程LY=B,UX=Y
	/*double *x = new double[order]();
	double *y = new double[order]();
	double sum;
	*y = *b;
	for (int i = 1; i < order; ++i)
	{
		sum = 0;
		for (int j = 0; j < i; ++j)
		{
			sum += *(L + i*order + j)*(*(y + j));
		}
		*(y + i) = *(b + i) - sum;
	}
	
	*(x + order - 1) = *(y + order - 1) / *(U+order*order-1);
	for (int i = order - 2; i>=0; i--)
	{
		sum = 0;
		for (int j = i + 1; j < order; ++j)
		{
			sum += *(U + i*order + j)*(*(x + j));
		}
		*(x + i) = (*(y + i) - sum)/ (*(U+(i+order)*i));
	}

	for (int i = 0; i < order; ++i)
	{
		cout << *(y + i) << endl;
	}

	for (int i = 0; i < order; ++i)
	{
		cout << *(x + i) << endl;
	}*/

	//delete [] y;
	//delete [] x;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值