`
wangchangshuai0010
  • 浏览: 122857 次
  • 性别: 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++代码 矩阵行列式,转置,乘积,求逆 高斯约旦法,行列式法求解逆矩阵 一部分自己写的

    逆矩阵的求法行列式初等变换

    首先,我们已经了解了一个矩阵的逆矩阵可以通过伴随矩阵和行列式来求得,即 \( A^{-1} = \frac{1}{\det(A)}A^* \),但这在计算过程中可能会变得相当复杂。当矩阵的阶数增加时,直接计算行列式和伴随矩阵会变得极其...

    C语言编写矩阵函数包(矩阵的加,减,乘,转置矩阵,逆矩阵)

    之后,程序会提示用户输入矩阵A和B的元素,并计算出矩阵乘积C。 #### 四、矩阵转置 **矩阵转置**是指交换矩阵的行和列,得到的新矩阵称为原矩阵的转置。对于一个m×n矩阵A,其转置矩阵\( A^T \)的维度为n×m,计算...

    C#求矩阵的逆

    ### C#求矩阵的逆 在数学领域,特别是线性代数中,矩阵及其逆矩阵是极其重要的概念。矩阵的逆(inverse)指的是一个与原矩阵相乘结果为单位矩阵的矩阵。对于给定的矩阵A,如果存在矩阵B使得AB = BA = I(I为单位...

    C语言矩阵的逆、矩阵乘法、矩阵行列式、矩阵转置

    本篇文章将深入探讨如何使用C语言实现矩阵的逆、矩阵乘法、矩阵行列式以及矩阵转置。 首先,我们来理解矩阵的基本概念。矩阵可以看作是由有序数组构成的矩形阵列,通常用大写字母表示,如A、B等。每个元素由行和列...

    求方阵的行列式,逆矩阵,满秩分解

    本主题主要关注三个核心概念:行列式、逆矩阵和满秩分解。这些概念对于理解和解决各种计算问题,特别是在数值线性代数、机器学习、图像处理以及工程领域具有至关重要的作用。 首先,我们来详细解释一下“行列式”。...

    C++实现各种矩阵运算

    本文将详细讨论如何使用C++标准模板库(STL)和面向对象编程思想来实现矩阵的各种运算,如矩阵相加、矩阵相乘、求逆、转置以及计算行列式。 1. **矩阵基础**: - 矩阵是由数字构成的矩形阵列,通常用大括号`{}`或...

    MATLAB做的矩阵计算器,涵盖一了一般的矩阵计算要求,矩阵加法,减法,除法,乘法,求逆,转置,旋转,求行列式

    本文将深入探讨MATLAB如何实现矩阵的加法、减法、乘法、除法、求逆、转置、旋转、求行列式以及矩阵的其他特有运算。 1. **矩阵加法与减法**: 在MATLAB中,两个同型矩阵可以直接进行加法或减法运算。例如,如果有...

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

    在数学的线性代数领域,可逆矩阵和矩阵乘积的行列式是核心概念,尤其是在软件网络技术中,理解这些概念对于解决复杂系统问题至关重要。可逆矩阵,也称为非奇异矩阵,是指在数域F上的一个n阶矩阵A,如果存在另一个n阶...

    求下三角矩阵的逆矩阵的详细算法

    一个矩阵可逆的必要充分条件是其行列式不等于零。 #### 计算下三角矩阵的逆矩阵 给定的代码实现了一个用于求解下三角矩阵逆矩阵的算法。下面将详细介绍该算法的工作原理及其背后的数学逻辑。 #### 代码分析 首先...

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

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

    Cholesky 分解——把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解

    对称正定矩阵是线性代数中的一个重要概念,这类矩阵满足两个关键性质:首先,它们是对称的,即\( A = A^T \),这意味着矩阵的所有元素关于主对角线对称;其次,它们的所有特征值都是正的,这确保了矩阵的所有行列式...

    矩阵的各种运算,包括逆和转置的运算

    矩阵的加法和减法是两个基本操作,它们要求两个矩阵的维度必须相同(即行数和列数都相等)。 #### 加法: 给定两个同维度的矩阵 A 和 B,其加法 C = A + B 可以通过将对应位置的元素相加来得到。具体实现可以通过 `...

    线性代数 工具包求逆矩阵 求行列式的值

    线性代数工具包v1.3提供了这些功能,用户可以轻松地对矩阵进行操作,包括求逆和计算行列式,而无需手动进行复杂的计算。这大大提高了工作效率,也使得非专业人员更容易理解和应用线性代数的概念。在实际应用中,这样...

    矩阵的常用运算,如求逆,转置,矩阵分解等

    求矩阵秩可以通过行简化或列简化来实现,也可以通过矩阵的零空间和核来确定。 最后,**特征值和特征向量**是矩阵的固有属性。对任意非零向量v,如果存在标量λ使得Av=λv,那么λ称为特征值,v称为对应于λ的特征...

    求逆矩阵的完全代码

    - **矩阵行列式的性质**:深入研究行列式的各种性质可以帮助更好地理解和计算逆矩阵。 - **高斯消元法原理**:掌握高斯消元法的基本原理对于实现更高效的算法非常重要。 - **数值稳定性考虑**:在实际编程过程中,还...

    java 矩阵转置、求逆等的实现

    在Java编程中,矩阵操作是线性代数中常见的任务,包括矩阵的转置、求逆和矩阵乘法。这些操作在科学计算、图像处理、机器学习等领域有着广泛的应用。以下将详细介绍这些概念以及如何在Java中实现它们。 首先,矩阵...

    矩阵求行列式

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

    C#矩阵类(相加,相乘,转置,求逆)

    并非所有矩阵都有逆矩阵,只有方阵(行数和列数相等的矩阵)且行列式不为零的矩阵才有逆矩阵。C#中求逆矩阵可以使用Lapack库或.NET框架的MathNet.Numerics库。以下是一个使用MathNet.Numerics的例子: ```csharp ...

Global site tag (gtag.js) - Google Analytics