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