packagecom.clarck.datastructure.matrix;/*** 矩阵类
*
*@authorclarck
**/
public classMatrix {/*** 存储矩阵元素的二维数组*/
private intelement[][];/*** 构造m*n零矩阵
*@paramm
*@paramn*/
public Matrix(int m, intn) {//若m或n为负数,Java将抛出负数组长度异常NegativeArrayException
this.element = new int[m][n];
}/*** 深拷贝
*@parammat*/
publicMatrix(Matrix mat) {this(mat.element.length, mat.element[0].length, mat.element);
}/*** 构造n*n零矩阵
*@paramn*/
public Matrix(intn) {this(n, n);
}/*** 返回当前矩阵与mat相加后的矩阵,不改变当前矩阵,=this+mat,各对应元素相加
*@parammat
*@return
*/
publicMatrix plus(Matrix mat) {
Matrix matc= new Matrix(this); //深拷贝
matc.add(mat);return matc; //返回对象引用
}/*** 构造m*n矩阵,由mat提供元素
*@paramm
*@paramn
*@parammat*/
public Matrix(int m, int n, intmat[][]) {this(m, n);for (int i = 0; i < mat.length && i < m; i++) {for (int j = 0; j < mat[i].length && j < n; j++) {this.element[i][j] =mat[i][j];
}
}
}/*** 返回矩阵第i行,第j列元素值 O(1)
*@parami
*@paramj
*@return
*/
public int get(int i, intj) {//若i,j下标越界,Java将抛出数组下标越界异常ArrayIndexOutOfBoundsException
return this.element[i][j];
}/*** 设置矩阵第i行第j列的元素值为value O(1)
*@parami
*@paramj
*@paramvalue*/
public void set(int i, int j, intvalue) {this.element[i][j] =value;
}/*** 返回矩阵所有元素的描述字符串,行主序遍历*/@OverridepublicString toString() {
String str= " 矩阵 " + this.getClass().getSimpleName() + " (" + this.element.length + " * " + this.element[0].length + ") :\n";for (int i = 0; i < this.element.length; i++) {for (int j = 0; j < this.element[i].length; j++) {
str+= String.format("%4d", this.element[i][j]);
}
str+= "\n";
}returnstr;
}/*** 当前矩阵与mat矩阵相加,this += mat, 各对应元素相加;改变当前矩阵
*@parammat*/
public voidadd(Matrix mat) {if (this.element.length != mat.element.length ||
this.element[0].length != mat.element[0].length)throw new IllegalArgumentException("两个矩阵阶数不同,不能相加");for (int i = 0; i < this.element.length; i++) {for (int j = 0; j < this.element[i].length; j++) {this.element[i][j] +=mat.element[i][j];
}
}
}/*** 比较两个同阶矩阵是否相等*/
public booleanequals(Object obj) {if (this ==obj)return true;if (!(obj instanceofMatrix))return false;
Matrix mat=(Matrix) obj;if (this.element.length !=mat.element.length|| this.element[0].length != mat.element[0].length)return false;for (int i = 0; i < this.element.length; i++)for (int j = 0; j < this.element[i].length; j++)if (this.element[i][j] !=mat.element[i][j])return false;return true;
}/*** 返回当前矩阵的转置矩阵
*@return
*/
publicMatrix transpose() {//构造零矩阵
Matrix trans = new Matrix(this.element[0].length, this.element.length);for (int i = 0; i < this.element.length; i++)for (int j = 0; j < this.element[i].length; j++)
trans.element[j][i]= this.element[i][j];returntrans;
}/*** 判断当前矩阵是否为上三角矩阵
*@return
*/
public booleanisUpTriangular() {if (this.element.length != this.element[0].length)return false;for (int i = 0; i < this.element.length; i++)for (int j = 0; j < i; j++)//下三角元素为0
if (this.element[i][j] != 0)return false;return true;
}/*** 判断当前矩阵是否为下三角矩阵
*@return
*/
public booleanisDownTriangular() {if (this.element.length != this.element[0].length)return false;for (int i = 0; i < this.element.length; i++)for (int j = i; j < this.element.length; j++)//上三角元素为0
if (this.element[i][j] != 0)return false;return true;
}/*** 判断当前矩阵是否为对称矩阵
*@return
*/
public booleanisSymmetric() {if (this.element.length != this.element[0].length)return false;for (int i = 0; i < this.element.length; i++)for (int j = 0; j < this.element[i].length; j++)if (this.element[i][j] != this.element[j][i])return false;return true;
}
}