java:自定义矩阵类

时间:2025-02-17 10:16:34
/*我所设计的矩阵类包含以下功能:(不只是加法功能和转置功能) * 1.三种普通构造方法以及一种复制构造方法 * 2.矩阵的加法、减法、数乘、求负以及矩阵乘法的运算 * 3.矩阵的转置 * 4.矩阵的三种判断:矩阵是否同型、矩阵是否相等以及矩阵是否为方阵 * 5.计算矩阵的迹、矩阵中所有元素的和以及矩阵的乘方 * 6.获取矩阵的行数和列数 * 7.输出矩阵相关的所有信息 * 8.获取行列数确定的单位矩阵的静态方法 */ public class Basematrix { private double[][] matrix;//用二维数组存储矩阵,数据成员声明为私有保证封装性和安全性 private int column,row;//分别声明矩阵的行数和列数 //声明了三种普通构造方法和一种复制构造方法 public Basematrix() {}//默认构造方法,只是为了方便创建一个矩阵对象 public Basematrix(int column,int row)//以行数和列数为参数的构造方法,确定矩阵的类型但是还不填充元素 { this.column=column; this.row=row; this.matrix=new double[column][row];//此处容易出错,尽管只给出行数和列数,但是也应该对作为引用类型的数据成员matrix进行创建 } public Basematrix(double [][]matrix)//以一个二维数组作为参数的构造方法,由二维数组的相关性质便可以确定矩阵的行数和列数 { this.column=matrix.length; this.row=matrix[0].length; this.matrix=new double[column][row]; for(int i=0;i<column;i++) { for(int j=0;j<row;j++) this.matrix[i][j]=matrix[i][j]; } } public Basematrix(Basematrix Matrix)//复制构造函数 { this.column=Matrix.column; this.row=Matrix.row; this.matrix=new double[column][row];//不直接使用=是为了实现深复制 for(int i=0;i<column;i++) { for(int j=0;j<row;j++) this.matrix[i][j]=matrix[i][j]; } } //声明了矩阵的加法、减法、数乘和乘法运算 public Basematrix add(Basematrix Matrix)//矩阵的加法运算 { Basematrix temp=new Basematrix(column,row);//两个矩阵是同型矩阵时,对应位置的元素相加 for(int i=0;i<column;i++) { for(int j=0;j<row;j++) { temp.matrix[i][j]=this.matrix[i][j]+Matrix.matrix[i][j]; } } return temp; } public Basematrix substract(Basematrix Matrix)//矩阵的减法运算,与加法运算类似 { if(!this.SameKind(Matrix)) { System.out.println("You can't substract two kinds of matrix"); return (new Basematrix(1,1)); } Basematrix temp=new Basematrix(column,row); for(int i=0;i<column;i++) { for(int j=0;j<row;j++) temp.matrix[i][j]=this.matrix[i][j]-Matrix.matrix[i][j]; } return temp; } public Basematrix multiple(double n)//矩阵的数乘运算,每个元素分别数乘即可 { Basematrix temp=new Basematrix(this.matrix); for(int i=0;i<column;i++) { for(int j=0;j<row;j++) temp.matrix[i][j]*=n; } return temp; } public Basematrix multiple(Basematrix Matrix)//矩阵的乘法运算,是矩阵运算中较为复杂的运算,使用了方法重载 { if(this.row!=Matrix.column)//判断两个矩阵是否能进行乘法运算 { System.out.println("You can't mutiple these two kinds of matrixs"); return (new Basematrix(1,1)); } Basematrix temp=new Basematrix(this.column,Matrix.row);//能进行乘法运算时,执行下列语句 for(int i=0;i<temp.column;i++) { for(int j=0;j<temp.row;j++) { double sum=0; for(int k=0;k<this.row;k++) sum+=(this.matrix[i][k]*Matrix.matrix[k][j]); temp.matrix[i][j]=sum;//通过上述算法计算每一个元素的值 } } return temp; } //声明了求负矩阵的方法 public Basematrix negative() { Basematrix temp=new Basematrix(this.matrix); for(int i=0;i<column;i++) { for(int j=0;j<row;j++) temp.matrix[i][j]=-this.matrix[i][j]; } return temp; } //声明了矩阵的转置方法 public Basematrix reverse() { Basematrix temp=new Basematrix(row,column);//新建一个行数与列数与原矩阵相反的矩阵 for(int i=0;i<column;i++) { for(int j=0;j<row;j++) temp.matrix[j][i]=this.matrix[i][j];//填充新矩阵中的元素 } return temp; } //声明了判断矩阵同型、矩阵相等和是否为方阵的方法,返回值均为boolean类型 public boolean SameKind(Basematrix Matrix)//判断两个矩阵是否同型 { if(this.column==Matrix.column&&this.row==Matrix.row) return true; else return false; } public boolean equal(Basematrix Matrix)//判断两个矩阵是否相等 { if(!this.SameKind(Matrix))//矩阵相等的前提条件是两个矩阵同型 return false; for(int i=0;i<column;i++) { for(int j=0;j<row;j++) if(this.matrix[i][j]!=Matrix.matrix[i][j]) return false; } return true; } public boolean phalanx()//判断矩阵是否为方阵 { if(column==row) return true; else return false; } //声明了计算矩阵的迹和所有元素之和的方法 public double trail()//计算矩阵的迹 { if(!phalanx())//矩阵有迹的前提是矩阵是一个方阵 { System.out.println("Not a phalanx!"); return 0; } else//对角线上的元素相加 { double Trail=0; for(int i=0;i<column;i++) Trail+=this.matrix[i][i]; return Trail; } } public double sum()//计算矩阵中所有元素的和 { double Sum=0; for(int i=0;i<column;i++) { for(int j=0;j<row;j++) Sum+=this.matrix[i][j]; } return Sum; } public Basematrix pow(int n)//计算矩阵的乘方 { if(!this.phalanx())//首先判断矩阵是否是方阵 { System.out.println("You can't calculate the pow of a non-phalanx!"); return (new Basematrix(1,1)); } Basematrix temp=Basematrix.unit(this.column); for(int i=1;i<=n;i++)//通过循环方式多次矩阵相乘的方法来计算乘方 temp=temp.multiple(this); return temp; } //获取行列数确定的单位矩阵的方法,由于该方法不属于类中的某一个对象,因此设置为静态方法 public static Basematrix unit(int n) { Basematrix unit=new Basematrix(n,n); for(int i=0;i<unit.column;i++) unit.matrix[i][i]=1; return unit; } //声明了矩阵的两个对外公有接口,分别获取行数和列数 public int getColumn() {return column;} public int getRow() {return row;} //声明了获取矩阵所有信息并输出的方法 public void show() { //首先输出行数和列数 System.out.println("This is a matrix with "+column+" columns and "+row+" rows."); System.out.println("The elements of the matrix:"); for(int i=0;i<column;i++) { for(int j=0;j<row;j++) System.out.printf("%5.2f", matrix[i][j]);//以格式化方法输出矩阵中每一个元素的值 System.out.println(""); } } }