`
wangchangshuai0010
  • 浏览: 120333 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

关于矩阵的一些操作(求转置矩阵、行列式、矩阵的秩、矩阵的逆矩阵、两个矩阵的乘积矩阵)

    博客分类:
  • C
阅读更多

 

该程序的功能主要解决一些简单矩阵计算问题。

主要功能有:

① 矩阵输入

② 矩阵输出

③ 输出矩阵的转置矩阵(可转置任意行列的矩阵)

④ 求方阵的行列式(如果你输入错误,程序将提示你错误,你可关闭程序,重新输入行列相同的矩阵,再进行计算)

⑤ 求矩阵的秩

⑥ 求矩阵的逆矩阵(前提:行和列相等)

⑦ 求两个矩阵的乘积矩阵(其中之一是你已经输入的那一个矩阵,另一个你可自行输入,可计算多次乘积)

下面看代码:

 

/*
author:wangchangshuai0010 sdust 
*/
#include<stdio.h>
#include<math.h>
#define N 10

void output(double a[][N],int am,int an)
{
	int i,j;
	printf("\nThe OriginalMatrix A is:\n");
	printf("**********************************************\n");
    for(i=0;i<am;i++) 
    { 
	   for(j=0;j<an;j++)
	   {
		   printf("%10.4f",a[i][j]);
	   }
	   printf("\n");
    }
}



void inver(double b[][N],int am,int an)
{
	int i,j;
	double a[N][N],c[N][N];
	for(i=0;i<am;i++)
	{
		for(j=0;j<an;j++)
		{
			a[i][j]=b[i][j];
		}
	}
	for(i=0;i<am;i++)
	{
		for(j=0;j<an;j++)
		{
			c[j][i]=a[i][j]; 
		}
	}
    for(i=0;i<an;i++) 
    {
	   for(j=0;j<am;j++)
	   {
		   printf("%10.4f",c[i][j]);
	   }
	   printf("\n");
    }
}

double getdet(double b[][N],int am,int an)
{
	int i,j,k,l,nexti,count=0;
	double temp,a[N][N],detA=1.0,x;
	for(i=0;i<am;i++)
	{
		for(j=0;j<an;j++)
		{
			a[i][j]=b[i][j];
		}
	}
	if(am==an)
	{
		for(i=0,j=0;i<am-1;i++,j++)
		{
			nexti=i;
			while(a[i][j]==0)
			{
				nexti++;
				temp=a[i][j];
				a[i][j]=a[nexti][j];
				a[nexti][j]=temp;
			}
			for(k=j+1;k<am;k++)
			{
				temp=a[i][k];
				a[i][k]=a[nexti][k];
				a[nexti][k]=temp;
			}
			for(l=i+1;l<an;l++)
			{
				if(a[l][j]==0)
				{l++;}
				else
				{
					x=a[l][j]/a[i][j];
					for(k=j;k<am;k++)
					{
						
						a[l][k]=a[l][k]-(x)*a[i][k];
					}
				}
			}
		}
		for(i=0,j=0;i<am;i++,j++)
		{
			detA*=a[i][j];
		}
	}
	else
	{
		printf("error!\n");
	}
	return detA;
}


void getrank(double b[][N],int am,int an)
{
	int i,s,j,k,l,nexti,t=0,count=0;
	double temp,x,a[N][N],detA=1.0;
	if(am>an)
	{
		s=am;
		am=an;
		an=s;
	}
	for(i=0;i<am;i++)
	{
		for(j=0;j<an;j++)
		{
			a[i][j]=b[i][j];
		}
	}
	for(i=0,j=0;i<am-1;i++,j++)
	{
		nexti=i;
		while(a[i][j]==0)
		{
			nexti=i+1;
			temp=a[i][j];
			a[i][j]=a[nexti][j];
			a[nexti][j]=temp;
		}
		for(k=j+1;k<am;k++)
		{
			temp=a[i][k];
			a[i][k]=a[nexti][k];
			a[nexti][k]=temp;
		}
		for(l=i+1;l<an;l++)
		{
			if(a[l][j]==0)
			{l++;}			
			else
			{
				x=a[l][j]/a[i][j];
				for(k=j;k<am;k++)				
				{	
					a[l][k]=a[l][k]-(x)*a[i][k];
				}
			}
		}
	}
	for(i=an-1;i<an;i++)
	{
		for(j=am;j<an;j++)
		{
			if(a[i][j]!=0)
			{
				t++;
			}
		}
	}
	if(t==0)
	{
		for(i=0,j=0;a[i][j]!=0&&i<an;i++,j++)
		{count++;}
		printf("the rank is %d\n",count);
	}
	else
	{
		printf("**********************************************\n");
		printf("the rank is %d\n",am);
	}
}



void getnijuzhen(double b[][N],int am,int an)
{
	int i,j,k,l,m,n;
	double a[N][N],c[N][N],d[N][N],x;
	if(an!=am)
	{
		printf("error!\n");
	}
	else{
	  for(i=0;i<am;i++)
	  {
		for(j=0;j<an;j++)
		{
			a[i][j]=b[i][j];
		}
	  }
	 for(i=0;i<am;i++)
	 {
		for(j=0;j<an;j++)
		{
			m=i;
			n=j;
			for(k=0,m=0;k<am-1;k++,m++)
			{
				if(k==m)
				{m++;}
				for(l=0,n=0;l<am-1;l++,n++)
				{
					if(l==j)
					{n++;}
					c[k][l]=a[m][n];
				}
			}
			d[i][j]=getdet(c,an-1,an-1)*pow(-1,i+j);
		}
	 }
	 x=getdet(a,an,am);
	 if(x==0)
	 {
		 printf("error!can't get nijuzhen!\n");
	 }
	 else
	 {
	 for(i=0;i<am;i++)
	 {
		for(j=0;j<an;j++)
		{
			d[i][j]=d[i][j]/x;
		}
	  }
	 printf("the nijuzhen of the matrix is:\n");
	 printf("**********************************************\n");
	 inver(d,an,an);
	 }
	}
}


void multiply(double c[N][N],int am,int an)
{
	int i,j,k,bm,bn;
	double a[N][N],b[N][N],d[N][N];
	printf("please input the row and line of matrix B:\n");
	scanf("%d %d",&bm,&bn);
	if(an!=bm)
	{
		printf("error!\n");
	}
	else
	{
		printf("please input the matrix A:\n");
	    for(i=0;i<bm;i++)
		{
		    for(j=0;j<bn;j++)
			{
			    scanf("%lf",&b[i][j]);
			}
		}
	    for(i=0;i<am;i++)
		{
		    for(j=0;j<an;j++)
			{
			    a[i][j]=c[i][j];
			}
		}
		for(i=0;i<am;i++)
		{
			for(j=0;j<bn;j++)
			{
				d[i][j]=0;
				for(k=0;k<bn;k++)
					d[i][j]+=a[i][k]*b[k][j];
			}
		}
		printf("the multiply of A and B is:\n");
		printf("**********************************************\n");
		for(i=0;i<am;i++)
		{
			for(j=0;j<bn;j++)
			{
				printf("%10.4lf",d[i][j]);
			}
			printf("\n");
		}
    }
}




void main()
{ 
   int m,n,i,j,select;
   double a[N][N],detA;
   printf("please input the row and line of matrix A:\n");
   scanf("%d %d",&m,&n);
   printf("please input the matrix A:\n");
   for(i=0;i<m;i++)
   {
	 for(j=0;j<n;j++)
	 {
		 scanf("%lf",&a[i][j]);
	 }
   }
   do
   {
	   printf("**********************************************\n");
	   printf("1-->output\n2-->inver\n3-->get detmination\n4->get rank\n5-->get nijuzhen\n6->get multiply of two matrixs\n0-->exit!\n");
	   printf("**********************************************\n");
	   do
	   {
		   printf("Please input your choice:\n(Warming:Please input number from 0 to 6,or it will be error!)\n");
		   scanf("%d",&select);
		   if(select>6||select<0)
		   {
			   printf("Error!please input the number again!\n");
		   }
	   }while(select>6||select<0);
			 switch(select)
			 {
			 case 1:
				 output(a,m,n);
				 break;
			 case 2:
				 printf("\nThe InverseMatrix is:\n");
				 printf("**********************************************\n");
				 inver(a,m,n);
				 break;
			 case 3:
				 detA=getdet(a,m,n);
				 printf("the detmination is %.4lf\n",detA);
				 break;
			 case 4:
				 getrank(a,m,n);
				 break;
			 case 5:
				 getnijuzhen(a,m,n);
				 break;
			 case 6:
				 multiply(a,m,n);
			 default:
				 break;
			 }
		 }while(select!=0);
}


   
2
0
分享到:
评论

相关推荐

    c++矩阵行列式,转置,乘积,求逆

    c++代码 矩阵行列式,转置,乘积,求逆 高斯约旦法,行列式法求解逆矩阵 一部分自己写的

    矩阵运算类行列式求逆秩类

    基本的矩阵运算的算法,行列式,求逆,秩,矩阵之间的乘积

    矩阵求行列式

    矩阵求行列式的C语言实现,将矩阵化为上三角阵求对角线乘积。

    LU 分解法求矩阵的逆

    LU分解是矩阵分解的一种,可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积)。LU分解主要应用在数值分析中,用来解线性方程、求矩阵的逆或计算行列式。

    可逆矩阵矩阵乘积的行列式[定义].pdf

    可逆矩阵矩阵乘积的行列式[定义].pdf

    2特殊矩阵方阵乘积的行列式.pdf

    2特殊矩阵方阵乘积的行列式.pdf

    矩阵计算源代码.cpp

    该资源主要是利用c++编写的特殊矩阵计算系统,通过建立矩阵的压缩存储结构来对特殊矩阵进行相关的二元运算,即通过输入两个自定义行列数的压缩矩阵,并输入压缩后的二维矩阵(单位矩阵输入对角线元素,其余矩阵按照...

    考研线性代数大纲.pdf

    考研线性代数大纲.pdf, 部分内容: 一、行列式 考试内容 行列式的概念和基本性质 行列式按行(列)展开定理 考试要求: ...概念,掌握用初等变换求矩阵的秩和逆矩阵的方法. 5.了解分块矩阵及其运算. 三、向量

    windlx 2个二维数组乘积

    学生好用的 代码,计算机体系结构实验课需要的代码,求2个二维数组积

    矩阵相关计算的python实现

    这是一个矩阵相关运算的代码,包括了求矩阵的加减,乘积,逆,行列式等的python代码。

    矩阵运算及解线性方程组工具

    主要功能:求矩阵的行列式,矩阵的秩,伴随矩阵,两个矩阵的和,两个矩阵的乘积;以及求出解线性方程组的解,包括有唯一解,矛盾或有多个解的情况。

    矩阵求逆和行列式:通过阶次展开和缩合求矩阵的逆和行列式-matlab开发

    给定方阵的逆矩阵和行列式可以通过以下例程同时应用矩阵阶数展开和压缩来计算。 完成迭代后,展开过程产生给定矩阵 (invM) 的逆,压缩过程生成一组主元元素 (p),最终给出给定矩阵 (M) 的行列式 (detM): [invM,detM...

    lec 05 矩阵的运算1

    第二节 矩阵的运算矩阵的转置方阵的行列式矩阵乘积的意义1. 定义显然有 A + (-A) = O. 由此可定义矩阵的差为若记 - A = ( -aij) , 则

    inv_det_0(A):矩阵的逆和行列式通过阶展开和缩合-matlab开发

    乘法/除法运算的总数约为 N^3,这是两个 NxN 矩阵的乘积所需要的。 该例程涉及简单的算术除法,如果除法器变为零,则会失败。 在这种情况下,在运行例程之前,我们必须在给定矩阵的行和列之间进行交换。

    线性代数必须熟记的结论

    1. 行列式共有 个元素,展开后有 项,可分解为 行列式; 2. 代数余子式的性质: ①、 和 的大小无关; ②、某行(列)的元素乘以其它行(列)元素的代数余子式为0; ③、某行(列)的元素乘以该行(列)元素的代数...

    大矩阵的对数行列式的安全计算:以安全的方式计算矩阵行列式的对数,避免上溢/下溢。-matlab开发

    矩阵行列式的对数广泛出现在多元统计的背景下。 高斯分布的 log-pdf、熵和散度通常包括一个对数行列式形式的项。 这个函数在那里可能很有用,尤其是在高维空间中。 但是,计算对数行列式的标准方法: 日志(det(A...

    量子群,Yang–Baxter映射和拟行列式

    众所周知,通用R矩阵对代数张量平方的元素的伴随作用构成了一个量子Yang-Baxter映射,它满足集合理论的Yang-Baxter方程。 该图在定义为通用R矩阵图像的L算子中具有零曲率表示。 我们发现零曲率表示可以通过L算子的...

    第02章矩阵1

    第 2 章矩阵本章要求:(1) 理解矩阵的概念,了解一些特殊矩阵及其性质;熟练掌握矩阵的基本运算及其规律.了解方阵的幂与方阵乘积的行列式性质;(2) 理解逆矩阵

    《MATLAB在日常计算中的应用》【杜树春】样章

    5.6求矩阵的特征值和特征向量 5.6.1求2阶矩阵的特征值和特征向量 5.6.2求3阶矩阵的特征值和特征向量 5.6.3求4阶矩阵的特征值和特征向量 5.7小结 第6章解多元一次线性方程组 6.1多元一次方程组简介 6.2解实...

Global site tag (gtag.js) - Google Analytics