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

📄 reversalop.c

📁 这是一个求矩阵逆运算的程序
💻 C
字号:
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

/* 使用Gauss-Jordan消去法求n阶实矩阵的逆矩阵 */ 
int ReversalOp(double *matrixa, int rank) 
{ 
	int *is,*js,i,j,k,l,u,v; 
	double d,p; 
	is=(int*)malloc(rank*sizeof(int)); 
	js=(int*)malloc(rank*sizeof(int)); 


	for(k=0;k<=rank-1;k++) 
	{ 
		//第一步,全选主元
		//(从第 k 行、第 k 列开始的右下角子阵中选取绝对值最大的元素,并记住次元素所在的行号和列号,在通过行交换和列交换将它交换到主元素位置上。)
		d=0.0; 
		for (i=k; i<=rank-1; i++) 
			for (j=k; j<=rank-1; j++) 
			{ 
				l=i*rank+j; 
				p=fabs(matrixa[l]); 
				if (p>d) 
				{ 
					d=p; 
					is[k]=i;
					js[k]=j;
				} 
			} 
			if(d+1.0==1.0) 
			{
				free(is); 
				free(js); 
				printf("err**not inv\n"); 
				return(0); 
			} 
			if(is[k]!=k) 
				for(j=0;j<=rank-1;j++) 
				{
					u=k*rank+j;
					v=is[k]*rank+j; 
					p=matrixa[u]; 
					matrixa[u]=matrixa[v];
					matrixa[v]=p; 
				} 
				if(js[k]!=k) 
					for(i=0; i<=rank-1; i++) 
					{
						u=i*rank+k;
						v=i*rank+js[k]; 
						p=matrixa[u];
						matrixa[u]=matrixa[v];
						matrixa[v]=p; 
					} 
					
					//机算逆矩阵

					//第二步(m(k, k) = 1 / m(k, k))
					l=k*rank+k; 
					matrixa[l]=1.0/matrixa[l]; 

					//第三步(m(k, j) = m(k, j) * m(k, k),j = 0, 1, ..., n-1;j != k )
					for(j=0;j<=rank-1;j++) 
						if (j!=k) 
						{
							u=k*rank+j; 
							matrixa[u]=matrixa[u]*matrixa[l];
						} 

						//第四步(m(i, j) = m(i, j) - m(i, k) * m(k, j),i, j = 0, 1, ..., n-1;i, j != k )
						for(i=0;i<=rank-1;i++) 
							if(i!=k) 
								for(j=0;j<=rank-1;j++) 
									if(j!=k) 
									{ 
										u=i*rank+j; 
										matrixa[u]=matrixa[u]-matrixa[i*rank+k]*matrixa[k*rank+j]; 
									} 
									//第五步(m(i, k) = -m(i, k) * m(k, k),i = 0, 1, ..., n-1;i != k )
									for(i=0;i<=rank-1;i++) 
										if(i!=k) 
										{
											u=i*rank+k; 
											matrixa[u]=-matrixa[u]*matrixa[l];
										} 
	} 
	/*最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复的原则如下:在全选主元过程中,先交换的
	行(列)后进行恢复;原来的行(列)交换用列(行)交换来恢复。*/
	for(k=rank-1;k>=0;k--) 
	{ 
		if (js[k]!=k) 
			for(j=0;j<=rank-1;j++) 
			{ 
				u=k*rank+j; 
				v=js[k]*rank+j; 
				p=matrixa[u];
				matrixa[u]=matrixa[v];
				matrixa[v]=p; 
			} 
			if(is[k]!=k) 
				for(i=0;i<=rank-1;i++) 
				{
					u=i*rank+k;
					v=i*rank+is[k]; 
					p=matrixa[u]; 
					matrixa[u]=matrixa[v]; 
					matrixa[v]=p; 
				} 
	} 
	free(is);
	free(js); 
	return(1); 
} 

⌨️ 快捷键说明

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