java n*n矩阵求值及求逆矩阵

Python014

java n*n矩阵求值及求逆矩阵,第1张

import java.math.*  

import java.util.*  

import java.text.*  

public class matrix {  

    static int map1[][]=new int [110][110]  

    static int just[][]=new int [110][110]  

    public static void printf(int n,int map[][])  

    {  

        int i,j  

        for(i=1i<=ni++ )  

        {  

            for(j=1j<nj++)  

                System.out.print(map[i][j]+" ")  

            System.out.println(map[i][j])  

        }  

    }  

    public static void get(int numi,int numj,int map[][],int n)  

    {  

        int i,j,k,l  

        for(i=0i<n+10i++)  

            for(j=0j<n+10j++)  

                just[i][j]=1  

        for(i=1i<=n-1i++)//求余子式矩阵   

            for(j=1j<=n-1j++)  

            {  

                if(i>=numi&&j<numj)  

                just[i][j]=map[i+1][j]  

                else if(i>=numi&&j>=numj)  

                just[i][j]=map[i+1][j+1]  

                else if(i<numi&&j>=numj)  

                just[i][j]=map[i][j+1]  

                else if(i<numi&&j<numj)  

                just[i][j]=map[i][j]  

            }  

    }  

    //static int map[][]=new int [110][110]  

    public static int getans(int nn)  

    {  

        int map[][]=new int [110][110]   

        for(int i=1i<=nni++)  

        for(int j=1j<=nnj++)  

        map[i][j]=just[i][j]  

        if(nn==2)  

        return map[1][1]*map[2][2]-map[1][2]*map[2][1]  

        else if(nn==1)  

        return map[1][1]  

        else  

        {  

            int cnb=0  

            for(int i=1i<=nni++)  

            {  

                get(1,i,map,nn)//得到当前余子式 just   

            //  printf("pay attention!\n")  

                //print(map,nn)   

                //print(just,nn-1)  

                if(i%2==1)  

                cnb+=map[1][i]*getans(nn-1)  

                else  

                cnb-=map[1][i]*getans(nn-1)  

            }  

            return cnb  

        }  

    }  

    public static int gcd(int m,int n)  

    {  

//      if(m<n)  

//      matrix.gcd(n,m)  

//      if(n==0)  

//      return m  

//        

//      else  

//      return matrix.gcd(n,m%n)  

        int mm=m  

        int nn=n  

        if(mm<nn)  

        {  

            int c=mm  

            mm=nn  

            nn=c  

        }  

        int w=1  

        while(w!=0)  

        {  

            w=mm%nn  

            mm=nn  

            nn=w  

        }  

        return mm  

    }  

    public static void ans(int n,int m)  

    {  

        if(n*m<0)  

        {  

            System.out.print("-")  

            ans(Math.abs(n),Math.abs(m))  

            return   

        }  

        if(m==1)  

        System.out.print(n+"\t")  

        else if(n%m==0)  

            System.out.print(n/m+"\t")  

        else  

            System.out.print((n/matrix.gcd(m, n))+"/"+(m/matrix.gcd(m, n))+"\t")  

    }  

    public static void main(String[] args) {  

        // TODO 自动生成的方法存根  

        Scanner cin=new Scanner(System.in)  

        int i,j,k,l,m,p  

        while(true)  

        {  

            int n=cin.nextInt()  

            int ans=0  

            for(i=0i<n+10i++)  

                for(j=0j<n+10j++)  

                    map1[i][j]=1  

            for(i=1i<=ni++)  

                for(j=1j<=nj++)  

                {  

                    map1[i][j]=cin.nextInt()  

                    just[i][j]=map1[i][j]  

                      

                }  

            int ans1=matrix.getans(n)  

            System.out.println("矩阵的值为:")  

            System.out.println(ans1)  

            int map2[][]=new int [110][110]  

            for(i=1i<=ni++)  

                for(j=1j<=nj++)  

                {  

                    map2[i][j]=map1[j][i]  

                    just[i][j]=map2[i][j]  

                      

                }  

            System.out.println("转置矩阵为:")  

            matrix.printf(n, map2)  

            int help2=matrix.getans(n)  

            System.out.println(help2)  

            if(help2==0)  

            {  

                System.out.println("No inverse matrix")  

                continue  

            }  

            System.out.println("逆矩阵为:")  

            for(i=1i<=ni++)  

            {  

                for(j=1j<=nj++)  

                {  

                    matrix.get(i, j, map2, n)  

                    //boolean b=((i+j)%2==0)  

                    if((i+j)%2==0)  

                    matrix.ans(matrix.getans(n-1), help2)  

                    else  

                    matrix.ans(matrix.getans(n-1)*-1, help2)  

                }  

                System.out.println()  

            }  

            System.out.println()  

        }  

    }  

  

}

/**

 * 矩阵乘法

 * @param a

 * @param b

 * @return

 */

     public static double[][] mulMatrix(double[][] a,double[][] b){

      double[][] c=new double[a.length][b[0].length]

      //相乘的两个行列式需要满足,第一个行列式的列于第二个行列式的行相等

      if(a[0].length!=b.length){

      System.out.println("Wrong parameters.")

      return c

      }

      //若A为mXn矩阵,B为nXp矩阵,返回一个mXp的矩阵

      for (int i = 0 i < c.length i++) {

for (int j = 0 j < c[0].length j++) {

               for (int j2 = 0 j2 < a[0].length j2++) {

c[i][j]=c[i][j]+a[i][j2]*b[j2][j]

}

}

}

      return c

     } /**

 * 计算行列式的值

 * @param a

 * @return

 */

    static double determinant(double[][] a){

        double result2 = 0

        if(a.length>2){

         //每次选择第一行展开

            for(int i=0i<a[0].lengthi++){

                //系数符号

                double f=Math.pow(-1,i)

                //求余子式

                double[][] yuzs=new double[a.length-1][a[0].length-1]

                for (int j = 0 j < yuzs.length j++) {

for (int j2 = 0 j2 < yuzs[0].length j2++) {

//去掉第一行,第i列之后的行列式即为余子式

if(j2<i){

yuzs[j][j2]=a[j+1][j2]

}else {

yuzs[j][j2]=a[j+1][j2+1]

}

}

                //行列式的拉普拉斯展开式,递归计算

                result2+=a[0][i]*determinant(yuzs)*f

            }

        }

        else{

         //两行两列的行列式使用公式

            if(a.length==2){

                result2=a[0][0]*a[1][1]-a[0][1]*a[1][0]

            }

            //单行行列式的值即为本身

            else{

                result2=a[0][0]

            }

        }

        return result2

    }

转自