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阶单位矩阵,这种情况需要另外进行判断