⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 det.cpp

📁 进行矩阵求逆
💻 CPP
字号:
#include <iostream.h>
#include <stdio.h>
#include <math.h>

const int size = 56;
const double delta = 0.000001;

void  matrix_inverse(double *matrix, int size, double *inv_matrix);

void main()
{
	//构造五对角矩阵A
	double *A = new double[size*size];
	double *inv_A = new double[size*size];
	double a1 = 1.8;
	double a2 = -0.5;
	double a3 = 0.1;
	double *data = new double[size];//data等于五对角矩阵的第一行
	data[0] = a1;
	data[1] = a2;
	data[size-1] = a2;
	data[2] = a3;
	data[size-2] = a3;
	for (int i = 3; i < size-2; i++)
	{
		data[i] = 0;
	}
    //五对角矩阵:上一行的最后一个元素作为下一行的第一个元素,其余元素顺序向后移动一位
	for (int h = 0; h < size; h++)
	{
		for (int w = 0; w < size; w++)
		{
			int pos = (w-h+size)%size;
			A[h*size+w] = data[pos]; 
		}
	}
	delete []data;

	
	cout<<"原矩阵A"<<'\n';
	for (int m = 0; m < size; m++)
	{
		for (int n = 0; n < size; n++)
		{
			cout<<A[m*size+n]<<'\t';
		}
		cout<<'\n';
	}



	matrix_inverse(A, size, inv_A);
	
	cout<<"inv_A"<<'\n';
	for (m = 0; m < size; m++)
	{
		for (int n = 0; n < size; n++)
		{
			cout<<inv_A[m*size+n]<<'\t';
		}
		cout<<'\n';
	}
	delete []A;
	delete []inv_A;
	
}


double  matrix_value (double *matrix, int size)
{
	int i,j,m,n,s,t,k=1;
	double f=1,c,x,sn;
	double *matrix1 = new double[size*size];
	for (i = 0; i < size; i++)
	{
		for (j = 0; j < size; j++)
		{
			matrix1[i * size +j] = matrix[i * size +j];
		}
	}
	for (i=0,j=0;i<size&&j<size;i++,j++)
	{
		if (matrix1[i*size+j]==0)
		{
			for (m=i;fabs(matrix1[m*size+j])<delta && m < size;m++)
			if (m==size)
			{
				sn=0;
				//cout<<sn<<'\n';
			}
			else
				for (n=j;n<size;n++)
				{
					c=matrix1[i*size+n];
					matrix1[i*size+n]=matrix1[m*size+n];
					matrix1[m*size+n]=c;
				}
				k*=(-1);
		}
		for (s=size-1;s>i;s--)
		{
			x=matrix1[s*size+j];
			for (t=j;t<size;t++)
				matrix1[s*size+t]-=matrix1[i*size+t]*(x/matrix1[i*size+j]);
		}
	}
	for (i=0;i<size;i++)
	{
		f*=matrix1[i*size+i];
	} 
	sn=k*f;
	return sn;
	delete []matrix1;
}


void matrix_cofactor (double *matrix, int size, double *cof_matrix)
{
	//double *matrix         原矩阵
	//int size              方阵的维数
	//double *cof_matrix     代数余子式
	double *temp = new double[(size-1)*(size-1)];
	int z,j,k,l,m,g;
	
	for (z = 0; z < size; z++)
	{
		l = z;
		for (j = 0;j<size;j++)
		{
			m = j;
			for (k = 0;k<size-1; k++)
			{
				for (g = 0;g<size-1;g++)
				{
					if (g >= m && k < l)
					{
						temp[k*(size-1)+g] = matrix[k*size+g+1];
					}
					else if (k>=l && g<m)
					{
						temp[k*(size-1)+g] = matrix[(k+1)*size+g];
					}
					else if (k>=l && g>=m)
					{
						temp[k*(size-1)+g] = matrix[(k+1)*size+g+1];
					}
					else
						temp[k*(size-1)+g] = matrix[k*size+g];
				}//g
			}//k			
			cof_matrix[z*size+j] = matrix_value (temp, size-1);			
		}//j
	}//z	

	for (z = 0; z<size; z++)
	{
		for (j = 0; j<size; j++)
		{			
		    if ((z+j)%2!=0 && cof_matrix[z*size+j]!=0)
			{
				cof_matrix[z*size+j] = (-1)*cof_matrix[z*size+j];
			}			
		}
	}



	/*利用性质:循环矩阵的逆仍然是循环矩阵	
	    //只求第一行
    	l = 0;
		for (j = 0;j<size;j++)
		{
			m = j;
			for (k = 0;k<size-1; k++)
			{
				for (g = 0;g<size-1;g++)
				{
					if (g >= m)//右侧
					{
						temp[k*(size-1)+g] = matrix[(k+1)*size+g+1];
					}
					else//左侧
					{
						temp[k*(size-1)+g] = matrix[(k+1)*size+g];
					}
				}//g
			}//k
			
			cof_matrix[j] = matrix_value (temp, size-1);
			if (j%2!=0 && cof_matrix[j]!=0)
			{
				cof_matrix[j] = (-1)*cof_matrix[j];
			}
		}//j

		//循环矩阵:上一行的最后一个元素作为下一行的第一个元素,其余元素顺序向后移动一位
	for (int h = 1; h < size; h++)
	{
		for (int w = 0; w < size; w++)
		{
			int pos = (w-h+size)%size;
			cof_matrix[h*size+w] = cof_matrix[pos]; 
		}
	}
*/

	
	
	delete []temp;


}


void  matrix_inverse(double *matrix, int size, double *inv_matrix)
{
	//matrix       原矩阵(大小为size*size)
	//inv_matrix   逆矩阵	
	double value = 0;//行列式的值
	double temp = 0;//用来对矩阵进行转置

	int z,j;

	//value = matrix_value (matrix, size, size);
	value = matrix_value(matrix, size); 
	cout<<"value = "<<value<<'\n';

	//inv_matrix 中存放原矩阵各元素对应的“余子式”
	matrix_cofactor (matrix, size, inv_matrix);
	
	/*
	for (z = 0; z<size; z++)
	{
		for (j = 0; j<size; j++)
		{			
		    if ((z+j)%2!=0 && inv_matrix[z*size+j]!=0)
			{
				inv_matrix[z*size+j] = (-1)*inv_matrix[z*size+j];
			}			
		}
	}
	*/
	

    cout<<"代数余子式:"<<'\n';
	for (z = 0; z<size; z++)
	{
		for (j = 0; j<size; j++)
		{			
		    cout<<inv_matrix[z*size+j]<<'\t';			
		}
		cout<<'\n';
	}


	//对inv_matrix转置,此时inv_matrix中存放原矩阵的伴随矩阵
	for (z = 0; z<size; z++)
	{
		for (j = z+1; j<size; j++)
		{
			temp = inv_matrix[z*size+j];
			inv_matrix[z*size+j] = inv_matrix[j*size+z];
			inv_matrix[j*size+z] = temp;
		}
	}


/*
	cout<<"伴随矩阵:"<<'\n';
	for (z = 0; z<size; z++)
	{
		for (j = 0; j<size; j++)
		{			
		    cout<<inv_matrix[z*size+j]<<'\t';			
		}
		cout<<'\n';
	}
*/


	//求逆矩阵,此时inv_matrix中存放原矩阵的逆矩阵
	for (z = 0; z<size; z++)
	{
		for (j = 0; j<size; j++)
		{
			inv_matrix[z*size+j] = inv_matrix[z*size+j]/value;
		}
	}

}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -