矩阵相关运算

#include<math.h>

//计算矩阵的逆矩阵
void brinv(double a[],int n)
{
	int *is=new int[n];
	int *js=new int[n];

	for(int k=0;k<n;k++)
	{
		double d=0.0;
		for(int i=k;i<n;i++)
			for(int j=k;j<n;j++)
			{
				int l=i*n+j;
				double p=fabs(a[l]);
				if(p>d)
				{
					d=p;
					is[k]=i;
					js[k]=j;
				}
			}

		if(fabs(d)<0.000001)
			return;

		if(is[k]!=k)
		{
			for(int j=0;j<n;j++)
			{
				int u=k*n+j;
				int v=is[k]*n+j;

				double temp=a[u];
				a[u]=a[v];
				a[v]=temp;
			}
		}
		if(js[k]!=k)
		{
			for(int i=0;i<n;i++)
			{
				int u=i*n+k;
				int v=i*n+js[k];

				double temp=a[u];
				a[u]=a[v];
				a[v]=temp;
			}
		}

		int l=k*n+k;
		a[l]=1.0/a[l];
		for(int j=0;j<n;j++)
			if(j!=k)
			{
				int u=k*n+j;
				a[u]=a[u]*a[l];
			}
		for(int i=0;i<n;i++)
			if(i!=k)
				for(int j=0;j<n;j++)
					if(j!=k)
					{
						int u=i*n+j;
						a[u]=a[u]-a[i*n+k]*a[k*n+j];
					}

		for(int i=0;i<n;i++)
			if(i!=k)
			{
				int u=i*n+k;
				a[u]=-a[u]*a[l];
			}
	}
	for(int k=n-1;k>=0;k--)
	{
		if(js[k]!=k)
			for(int j=0;j<n;j++)
			{
				int u=k*n+j;
				int v=js[k]*n+j;
				double temp=a[u];
				a[u]=a[v];
				a[v]=temp;
			}
		if(is[k]!=k)
			for(int i=0;i<n;i++)
			{
				int u=i*n+k;
				int v=i*n+is[k];
				double temp=a[u];
				a[u]=a[v];
				a[v]=temp;
			}
	}

	delete[] is;
	delete[] js;
}

//计算矩阵的行列式
double bsdet(double a[],int n)
{
	double f,det;
	f=1.0;
	det=1.0;

	for(int k=0;k<n-1;k++)
	{
		double q=0.0;
		int is,js;

		for(int i=k;i<n;i++)
			for(int j=k;j<n;j++)
			{
				int l=8*n+j;
				double d=fabs(a[l]);
				if(d>q)
				{
					q=d;
					is=i;
					js=j;
				}
			}

		if(fabs(q)<0.00000001)
		{
			det=0.0;
			return det;
		}

		if(is!=k)
		{
			f=-f;
			for(int j=k;j<n;j++)
			{
				int u=k*n+j;
				int v=is*n+j;
				double temp=a[u];
				a[u]=a[v];
				a[v]=temp;
			}
		}
		if(js!=k)
		{
			f=-f;
			for(int i=k;i<n;i++)
			{
				int u=i*n+js;
				int v=i*n+k;

				double temp=a[u];
				a[u]=a[v];
				a[v]=temp;
			}
		}

		int l=k*n+k;
		det=det*a[l];
		for(int i=k+1;i<n;i++)
		{
			double d=a[i*n+k]/a[l];
			for(int j=k+1;j<n;j++)
			{
				int u=i*n+j;
				a[u]=a[u]-d*a[k*n+j];
			}
		}
	}

	det=f*det*a[n*n-1];

	return det;
}

//矩阵相乘
void brmul(double a[],double b[][25],int n,double c[])
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
			c[i]+=a[j]*b[j][i];
	}
}

void brmul(double a[][25],double b[],int n,double c[])
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
			c[i]+=a[i][j]*b[i];
	}
}

double brmul(double a[],double b[],int n)
{
	double ret=0;
	for(int i=0;i<n;i++)
		ret+=a[i]*b[i];

	return ret;
}
//求矩阵A的规范逆矩阵,存放在B中
void NormalizeMatrixInv(double A[][26],double B[][40])
{
	double AT[26][40]; //A的转置
	double ATA[26][26];
	double ATA_[26][26];

	//计算A的转置
	for(int i=0;i<40;i++)
		for(int j=0;j<26;j++)
			AT[j][i]=A[i][j];

	//计算A的转置乘以A
	for(int i=0;i<26;i++)
	{
		for(int j=0;j<26;j++)
		{
			double temp=0;
			for(int k=0;k<40;k++)
				temp+=AT[i][k]*A[k][j];
			ATA[i][j]=temp;
			ATA_[i][j]=temp;
		}
	}

	//计算(A^T*A)^-1
	double (*p)[26]=ATA_;
	brinv(*p,26);

	//X#
	for(int i=0;i<26;i++)
	{
		for(int j=0;j<40;j++)
		{
			double temp=0;
			for(int k=0;k<26;k++)
				temp+=ATA_[i][k]*AT[k][j];
			B[i][j]=temp;
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值