JAVA基础:矩阵的基本运算(打印,转置,加法,乘法,计算行列式,计算代数余子式,求逆)


以下只列出相应函数,在主函数调用时输入普通的二维数组即可返回得数。

1.打印矩阵

        public static void Mprint(double[][] m) //打印一个矩阵
	{
		for(int i=0;i<m.length;i++)
		{
			for(int j=0;j<m[0].length;j++)
			{
				System.out.print(m[i][j] + " ");
			}
			System.out.println("");
		}
	}

2.矩阵转置

        public static double[][] Trans(double[][] m)  //返回转置矩阵
	{
		double[][] a = new double[m[0].length][m.length];
		for(int i=0;i<m.length;i++)
		{
			for(int j=0;j<m[0].length;j++)
			{
				a[j][i] = m[i][j];
			}
		}
		return a;
	}

3.矩阵加法

        public static double[][] Add(double[][] m,double[][] n)  //矩阵加法
	{
		if(m.length != n.length || m[0].length != n[0].length)
		{ System.out.println("错误,矩阵违规");  System.exit(0);}
		double[][] a = new double[m.length][m[0].length];
		for(int i=0;i<m.length;i++)
		{
			for(int j=0;j<m[0].length;j++)
			{
				a[i][j] = m[i][j] + n[i][j];
			}
		}
		return a;
	}

4.矩阵乘法

        public static double[][] Mul(double[][] m,double[][] n) //矩阵乘法
	{
		double s;
		int k;
		if(m[0].length != n.length)
		{ System.out.println("相乘矩阵不规范");  System.exit (0);}
		double[][] a = new double[m.length][n[0].length];
		for(int i=0;i<m.length;i++)
		{
			for(int j=0;j<n[0].length;j++)
			{
				for(s=0,k=0;k<m[0].length;k++)
				{
					s = s + m[i][k]*n[k][j];
				}
				a[i][j] = s;
			}
		}
		return a;
	}

5.求矩阵行列式(包括了情况较为特殊的余子式的计算,替换成调用计算余子式的函数也可)

        public static double Det(double[][] m)  //求行列式
	{
		if(m.length != m[0].length)
		{System.out.println("错误,非方阵");  System.exit(0);}
		if(m.length == 1) //只有一个元素时直接返回
			return m[0][0];
		double l;
		double det=0;
		if(m.length > 2) //参数为矩阵时进行递归
		{
			for(int i=0;i<m.length;i++)
			{
				l = Math.pow(-1,i); //余子式的系数
				double[][] cof = new double[m.length -1][m.length -1];
				for(int j=0;j<cof.length ;j++) //构建余子式
				{
					for(int k=0;k<cof.length;k++)
					{
						if(j<i)
							cof[j][k] = m[k+1][j];
						if(j>i)
							cof[j][k] = m[k+1][j+1];
					}
				}
				det = det + l*m[0][i]*Det(cof);
			}
		}
		else
			return (m[0][0]*m[1][1] - m[0][1]*m[1][0]);
		
		return det;
	}

6.计算余子式(相比求行列式函数中包括的部分,此函数更具有一般性)

        public static double Cofm(double[][] m,int a,int b) //计算代数余子式
	{
		double l = Math.pow(-1,a+b); 
		double[][] res = new double[m.length -1][m.length -1];
		for(int i=0;i<res.length;i++)
		{
			for(int j=0;j<res.length;j++) 
			{
				if(i<a&&j<b)
					res[i][j] = m[i][j];
				else if(i>=a&&j<b)
					res[i][j] = m[i+1][j];
				else if(i<a&&j>=b)
					res[i][j] = m[i][j+1];
				else if(i>=a&&j>=b)
					res[i][j] = m[i+1][j+1];
			}
		} //代数余子式形式的矩阵
		return l*Det(res);
	}

7.矩阵求逆(注:调用了上面的求余子式的函数和求行列式的函数)

        public static double[][] Inv(double[][] m) //求逆矩阵
	{
		double[][] adj = new double[m.length][m.length];
		for(int i=0;i<m.length;i++)
		{
			for(int j=0;j<m.length;j++)
			{
				adj[j][i] = Cofm(m,i,j)/Det(m);  
			}
		}
		return adj;
	}

在主函数调用即可


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM