java操作矩阵运算(基本运算及求逆)
来源:互联网 发布:王侯将相宁有种乎的将 编辑:程序博客网 时间:2024/05/19 23:56
前一段时间使用JAVA进行一些矩阵运算,看了JAVA的JAMA类,但看起来很多地方不明白,因此自己重新对矩阵的运算使用了一个类进行了实现,发出来希望可以对大家有用!
package Matrix_src;public class Matrix { private int r_num; private int c_num; private double[][] content; public Matrix(int r, int c) { this.r_num = r; this.c_num = c; this.content = new double[this.r_num][this.c_num]; for (int i = 0; i < r_num; i++) for (int j = 0; j < c_num; j++) { this.content[i][j] = 0; } } public Matrix(double[][] in) { this.r_num = in.length; this.c_num = in[0].length; this.content = new double[this.r_num][this.c_num]; for (int i = 0; i < r_num; i++) for (int j = 0; j < c_num; j++) { this.content[i][j] = in[i][j]; } } public Matrix(int r, int c, int module) { this.r_num = r; this.c_num = c; this.content = new double[this.r_num][this.c_num]; for (int i = 0; i < this.r_num; i++) for (int j = 0; j < this.c_num; j++) { this.content[i][j] = (int) (Math.random() * module); } } public Matrix add(Matrix A) { if (this.r_num != A.r_num || this.c_num != A.c_num) { return null; } Matrix B = new Matrix(A.r_num, A.c_num); for (int i = 0; i < r_num; i++) { for (int j = 0; j < c_num; j++) { B.content[i][j] = this.content[i][j] + A.content[i][j]; } } return B; } public Matrix add(Matrix A, double module) { if (this.r_num != A.r_num || this.c_num != A.c_num) { return null; } Matrix B = new Matrix(A.r_num, A.c_num); for (int i = 0; i < r_num; i++) { for (int j = 0; j < c_num; j++) { B.content[i][j] = (this.content[i][j] + A.content[i][j]) % module; } } return B; } // compute this-A public Matrix sub(Matrix A) { if (this.r_num != A.r_num || this.c_num != A.c_num) { return null; } Matrix B = new Matrix(A.r_num, A.c_num); for (int i = 0; i < r_num; i++) { for (int j = 0; j < c_num; j++) { B.content[i][j] = this.content[i][j] - A.content[i][j]; } } return B; } public Matrix sub(Matrix A, double module) { if (this.r_num != A.r_num || this.c_num != A.c_num) { return null; } Matrix B = new Matrix(A.r_num, A.c_num); for (int i = 0; i < r_num; i++) { for (int j = 0; j < c_num; j++) { double tmp = this.content[i][j] - A.content[i][j]; if (tmp >= 0) B.content[i][j] = tmp % module; if (tmp < 0) B.content[i][j] = tmp % module + module; } } return B; } // compute this*A public Matrix multiply(Matrix A) { if (this.c_num != A.r_num) { return null; } Matrix B = new Matrix(this.r_num, A.c_num); for (int i = 0; i < this.r_num; i++) // the row of the this { for (int j = 0; j < A.c_num; j++) // the column of the A { double temp = 0; for (int k = 0; k < A.r_num; k++) // the row of A { temp += this.content[i][k] * A.content[k][j]; } B.content[i][j] = temp; } } return B; } public Matrix multiply(Matrix A,int module) { if (this.c_num != A.r_num) { return null; } Matrix B = new Matrix(this.r_num, A.c_num); for (int i = 0; i < this.r_num; i++) // the row of the this { for (int j = 0; j < A.c_num; j++) // the column of the A { double temp = 0; for (int k = 0; k < A.r_num; k++) // the row of A { temp += this.content[i][k] * A.content[k][j]%module; } B.content[i][j] = temp; } } return B; } public double Matrix2Det(){ double sum=this.content[0][0]*this.content[1][1]-this.content[0][1]*this.content[1][0]; return sum; } public void CompanionMatrix(Matrix in,int r,int c){ this.r_num=in.r_num-1; this.c_num=in.c_num-1; int k=0; for(int i=0;i<in.r_num;i++) { int z=0; if(i==r) i++; if(i==in.r_num) break; for(int j=0;j<in.c_num;j++) { if(j==c) j++; if(j==in.c_num) break; this.content[k][z]=in.content[i][j]; z++; } k++; } } private int IndexOfNe1(int n){ int sum=1; for(int i=0;i<n;i++) sum*=-1; return sum; } //comput the determinant of a matrix public double MatrixDet(){ if(this.c_num!=this.r_num) return 0; else{ int num=this.c_num; double sum=0; if(this.c_num==2){ return this.Matrix2Det(); } if(this.c_num>3){ for(int i=0;i<num;i++){ Matrix tmp=new Matrix(num-1,num-1); tmp.CompanionMatrix(this, 0, i); sum+=this.content[0][i]*tmp.MatrixDet()*IndexOfNe1(i); } return sum; } else{ return this.Matrix3Det(); } } } //comput the determinant of a 3-matrix public double Matrix3Det(){ if(this.r_num!=this.c_num) return 0; int num=this.r_num; double[] re_tmp=new double[this.c_num]; double sum1=0; double sum2=0; for(int k=0;k<num;k++){ re_tmp[k]=1; int i=0; int j=0; for(int z=0;z<num;z++){ if(k+z<num){ re_tmp[k]*=this.content[z][k+z]; } else{ re_tmp[k]*=this.content[num-i-1][k-j-1]; i++; j++; } } sum1+=re_tmp[k]; } for(int k=num-1;k>=0;k--){ re_tmp[k]=1; int i=0; int j=0; for(int z=0;z<num;z++){ if(k-z>=0){ re_tmp[k]*=this.content[z][k-z]; } else{ re_tmp[k]*=this.content[num-i-1][k+j+1]; i++; j++; } } sum2+=re_tmp[k]; } return sum1-sum2; } public Matrix MatrixInverse(){ double det=this.MatrixDet(); if(det==0) return null; Matrix re=new Matrix(this.r_num,this.c_num); for(int i=0;i<this.r_num;i++){ for(int j=0;j<this.c_num;j++){ Matrix tmp=new Matrix(this.r_num-1,this.c_num-1); tmp.CompanionMatrix(this, i, j); re.content[i][j]=tmp.MatrixDet()/det*IndexOfNe1(i+j); } } return re.Transpose(); } public Matrix Transpose() { Matrix re = new Matrix(this.r_num, this.c_num); for (int i = 0; i < this.r_num; i++) { for (int j = 0; j < this.c_num; j++) { re.content[j][i] = this.content[i][j]; } } return re; } public void printMatlab() { System.out.print("["); for (int i = 0; i < this.r_num; i++) { for (int j = 0; j < this.c_num; j++) { System.out.print(this.content[i][j]); if(j!=this.c_num-1) System.out.print(" "); } if(i<this.r_num-1) System.out.print(";"); } System.out.println("]"); } public void print() { for (int i = 0; i < this.r_num; i++) { for (int j = 0; j < this.c_num; j++) { System.out.print(this.content[i][j]); System.out.print(" "); } System.out.println(" "); } System.out.println(" "); } public static void main(String[] args) { double[][] a = { { 10, 22 }, { 15, 23 } }; double[][] a1 = { { 0, 1,2 }, { 1, 1,4 } ,{2,-1,0}}; double[][] a2={{1,2,3},{2,2,1},{3,4,3}}; double[][] a3={{1,1,1,1},{2,4,3,1},{4,16,9,1},{8,64,27,1}}; double[][] a4={{-2,2,-4,0,5},{2,1,2,0,5},{4,3,1,2,7},{3,1,2,4,-5},{6,-1,2,7,-5}}; Matrix A = new Matrix(a4); Matrix B = new Matrix(5,5); System.out.println(A.MatrixDet()); A.print(); B=A.MatrixInverse(); B.print(); //System.out.println("attention"+" "+A.MatrixDet()); Matrix C=A.multiply(B); C.print(); }}
JAVA也是刚开始尝试着写,可能还存在较多的缺陷,例如矩阵求逆算法的效率存在较大问题,希望大家谅解,谢谢!
转载请注明出处!
0 0
- java操作矩阵运算(基本运算及求逆)
- Matlab矩阵基本操作(定义,运算)
- Matlab矩阵基本操作(定义,运算)
- Matlab矩阵基本操作(定义,运算)
- Matlab矩阵基本操作(定义,运算)
- OpenCV操作基本矩阵运算
- 矩阵运算及 快速幂求矩阵
- 对称矩阵的压缩存储及基本运算(1)
- 对称矩阵的压缩存储及基本运算(2)
- 对称矩阵的压缩存储及基本运算(3)
- 基本矩阵运算的Java实现
- 基本矩阵运算的Java实现
- 矩阵基本运算库函数
- 矩阵基本运算
- 矩阵及其基本运算
- 矩阵基本运算
- 矩阵基本运算
- 矩阵的基本运算(C实现)
- 练习
- Leetcode 188 Best Time to Buy and Sell Stock IV
- 利用移位运算求解子集
- Android初级不得不知的知识
- Aoj-2249
- java操作矩阵运算(基本运算及求逆)
- 简单多边形及其性质
- John介绍及常用命令使用说明
- TP5 用户管理
- Git bash闪退问题
- solr学习1
- 【CodeForces 572B】Order Book(排序)
- CoreSeek快速安装教程
- Linux下部署svn服务器