【Java开源代码栏目提醒】:网学会员--在 Java开源代码编辑为广大网友搜集整理了:Matrix.java绩等信息,祝愿广大网友取得需要的信息,参考学习。
package book.arrayset;
import java.text.DecimalFormat;
/**
* 矩阵,使用二维数组
*/
public class Matrix implements Cloneable {
/** 矩阵的数据 */
private double[][] matrixData;
/**
* 默认构造函数
*/
public Matrix() {
this.init();
}
/**
* 用二维数组初始化矩阵对象
* @param data
*/
public Matrix(double[][] data) {
if (!this.canConvert2Matrix(data)) {
this.init();
} else {
// 把data的数据拷贝给矩阵
// 矩阵的行数为data.length,列数为data[0].length
this.matrixData = this.cloneArray(data);
}
}
/**
* 矩阵加法运算。
* 矩阵A和B可加的条件是矩阵A的行数等于矩阵B的行数,A的列数等于B的列数
* c[i][j] = a[i][j] + b[i][j]
* @param b 加数
* @return
*/
public Matrix add(Matrix b) {
if (b == null) {
return null;
}
Matrix c = null;
double[][] bData = b.getMatrixData();
if ((this.matrixData.length != bData.length)
|| (this.matrixData[0].length != bData[0].length)) {
System.out.println("两个矩阵的大小不一致,不能完成加法运算");
return c;
}
// 结果矩阵的数据
double[][] cData = new double[this.matrixData.length][this.matrixData[0].length];
for (int i = 0; i < this.matrixData.length; i++) {
for (int j = 0; j < this.matrixData[0].length; j++) {
// 两矩阵对应位置的数字做加法
cData[i][j] = this.matrixData[i][j] + bData[i][j];
}
}
c = new Matrix(cData);
return c;
}
/**
* 矩阵减法运算。
* 矩阵A和B可减的条件是矩阵A的行数等于矩阵B的行数,A的列数等于B的列数
* c[i][j] = a[i][j] + b[i][j]
* @param b 减数
* @return
*/
public Matrix sub(Matrix b) {
if (b == null) {
return null;
}
Matrix c = null;
double[][] bData = b.getMatrixData();
if ((this.matrixData.length != bData.length)
|| (this.matrixData[0].length != bData[0].length)) {
System.out.println("两个矩阵的大小不一致,不能完成减法运算");
return c;
}
// 结果矩阵的数据
int cRow = this.matrixData.length;
int cColumn = this.matrixData[0].length;
double[][] cData = new double[cRow][cColumn];
for (int i = 0; i < cRow; i++) {
for (int j = 0; j < cColumn; j++) {
// 两矩阵对应位置的数字做减法
cData[i][j] = this.matrixData[i][j] - bData[i][j];
}
}
c = new Matrix(cData);
return c;
}
/**
* 矩阵的数乘,结果矩阵行列数不变
* c[i][j] = num * a[i][j]
* @param num
* @return
*/
public Matrix multiplyNum(double num) {
int cRow = this.matrixData.length;
int cColumn = this.matrixData[0].length;
double[][] cData = new double[cRow][cColumn];
for (int i = 0; i < cRow; i++) {
for (int j = 0; j < cColumn; j++) {
cData[i][j] = num * this.matrixData[i][j];
}
}
return new Matrix(cData);
}
/**
* 矩阵乘法运算。
* 矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。
* 若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵
* C[i][j] = ("A[i][k] * B[k][j]"的累加)
* @param b 乘数
* @return
*/
public Matrix multiply(Matrix b) {
if (b == null) {
return null;
}
Matrix c = null;
double[][] bData = b.getMatrixData();
if (this.matrixData[0].length != bData.length) {
System.out.println("做乘法时矩阵a的列数要与b的行数相等!");
return c;
}
// 结果矩阵的数据,结果矩阵的行数为a的行数,列数为b的列数
int cRow = this.matrixData.length;
int cColumn = bData[0].length;
double[][] cData = new double[cRow][cColumn];
for (int i = 0; i < cRow; i++) {
for (int j = 0; j < cColumn; j++) {
cData[i][j] = 0;
for (int k = 0; k < this.matrixData[0].length; k++) {
cData[i][j] += this.matrixData[i][k] * bData[k][j];
}
}
}
c = new Matrix(cData);
return c;
}
/**
* 矩阵除法运算
* A/B等价于A乘以B的逆矩阵
* @param b
* @return
*/
public Matrix divide(Matrix b) {
if (b == null) {
return null;
}
if (!this.isSquareMatrix() || (!b.isSquareMatrix())
|| (this.matrixData.length != b.getMatrixData().length)) {
System.out.println("矩阵的除法要求两个矩阵都是方阵,而且行数相等!");
return null;
}
// 返回本矩阵与b的逆矩阵的乘积
return this.multiply(b.inverseMatrix());
}
/**
* 求矩阵的逆矩阵
* 为矩阵右加一个单位矩阵后进行初等行变换,当左边变成单位矩阵时,右边就是求得的逆矩阵。
* 矩阵的初等行变换法则
* (1)交换变换:交换两行
* (2)倍法变换:给一行数据乘以一个非0常数
* (3)消法变换:把一行所有元素的k倍加到另一行的对应元素上去
* 将上述规则中的行换成列同样有效
* 只有方阵才可能有逆矩阵!
* @return
*/
public Matrix inverseMatrix() {
if (!this.isSquareMatrix()) {
System.out.println("不是方