矩阵乘法

import java.util.*;
public class Main {
	/*
	 * tips:
	 * 1、矩阵乘法满足结合律和分配律,不满足交换律
	 * 2、矩阵的0次幂为原阶数的单位矩阵
	 */
	public static double[][] solve(int m1,int m2,int n,double[][] a,double[][] b){//起始幂m1,要求幂m2,阶数n,起始矩阵a,结果矩阵b
		if(m1==m2)
			return b;
		else{
			double[][] c=new double[n][n];
 			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					for(int r=0;r<n;r++){
						c[i][j]+=a[i][r]*b[r][j];
					}
				}
			}
 			return solve(m1+1,m2,n,a,c);
		}
	}
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println("两个矩阵相乘,输入1");
		System.out.println("计算矩阵的幂,输入2");
		System.out.println("结束程序,输入0");
		while(true){
			int in=sc.nextInt();
			if(in==0)
				System.exit(0);
			System.out.print("矩阵的阶数:");
			int n=sc.nextInt();//阶数(没有的元素用0表示)
			int m;//幂数
			double[][] a=new double[n][n],b=new double[n][n],res=new double[n][n];
			if(in==1){//两个矩阵相乘
				m=2;
				System.out.println("输入第一个矩阵:");
				for(int i=0;i<n;i++)
					for(int j=0;j<n;j++)
						a[i][j]=sc.nextDouble();
				System.out.println("输入第二个矩阵:");
				for(int i=0;i<n;i++)
					for(int j=0;j<n;j++)
						b[i][j]=sc.nextDouble();
				res=solve(1,m,n,a,b);
			}
			else{//计算矩阵的幂
				System.out.print("输入幂:");
				m=sc.nextInt();
				System.out.println("输入矩阵:");
				for(int i=0;i<n;i++){
					for(int j=0;j<n;j++){
						a[i][j]=sc.nextDouble();
						b[i][j]=a[i][j];
					}
				}
				if(m==0){//幂数为0,结果矩阵为阶数为n的单位矩阵
					for(int i=0;i<n;i++){
						for(int j=0;j<n;j++){
							if(i==j)
								res[i][j]=1;
							else
								res[i][j]=0;
						}
					}
				}
				else{//幂数不为0
					res=solve(1,m,n,a,b);
				}
			}
			System.out.println("结果矩阵:");
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					if(j==n-1)
						System.out.println(res[i][j]);
					else
						System.out.print(res[i][j]+" ");
				}
			}
		}
	}
}

这里给出的代码是用尾递归写的,当然也可以在主函数里直接用循环来写。

特别需要注意的是:

1、矩阵乘法满足结合律和分配律,不满足交换律

2、当幂数为0时,最终的结果矩阵应该是n阶单位矩阵,这种情况需要另外进行判断

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值