zoukankan      html  css  js  c++  java
  • java 矩阵求逆

    package com.yang.matrix;
    
    public class TestMatrix {
        
    
        public static void main(String[] args) {
            
            //         测试数据
            //        double[][] a={{0.2368,0.2471,0.2568,1.2671},
            //                {1.1161,0.1254,0.1397,0.149},
            //                {0.1582,1.1675,0.1768,0.1871},
            //                {0.1968,0.2071,1.2168,0.2271}};
            
            
            double[][] a={{1,3,1},
                    {2,1,1},
                    {2,2,1}
                     };
            double[][] b={{1,3,1},
                    {2,1,1},
                    {2,2,1}
                     };
            
            double[][] c= new double[3][3];
            
            TestMatrix tm=new TestMatrix();
            tm.Mrinv(a, 3);
                    
            //验证   A*A-1=E
            tm.Mrcheng(a,b,c,3,3,3);        
            tm.PrintMatrix(c, 3);
        }
    
        public static void PrintMatrix(double[][] a, int n){
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++)
                {
                    System.out.print(a[i][j]+"  ");
                }
                System.out.println();
            }
        }
        
        ////////////////////////////////////////////////////////////////////////
        //函数:Mrinv
        //功能:求矩阵的逆
        //参数:n---整数,矩阵的阶数
        //a---Double型n*n二维数组,开始时为原矩阵,返回时为逆矩阵
        ////////////////////////////////////////////////////////////////////////
        public static void Mrinv(double[][] a, int n) {
            int i, j, row, col, k;
            double max, temp;
            int[] p = new int[n];
            double[][] b = new double[n][n];
            for (i = 0; i < n; i++) {
                p[i] = i;
                b[i][i] = 1;
            }
    
            for (k = 0; k < n; k++) {
                // 找主元
                max = 0;
                row = col = i;
                for (i = k; i < n; i++)
                    for (j = k; j < n; j++) {
                        temp = Math.abs(b[i][j]);
                        if (max < temp) {
                            max = temp;
                            row = i;
                            col = j;
                        }
                    }
                // 交换行列,将主元调整到 k 行 k 列上
                if (row != k) {
                    for (j = 0; j < n; j++) {
                        temp = a[row][j];
                        a[row][j] = a[k][j];
                        a[k][j] = temp;
                        temp = b[row][j];
                        b[row][j] = b[k][j];
                        b[k][j] = temp;
                    }
                    i = p[row];
                    p[row] = p[k];
                    p[k] = i;
                }
                if (col != k) {
                    for (i = 0; i < n; i++) {
                        temp = a[i][col];
                        a[i][col] = a[i][k];
                        a[i][k] = temp;
                    }
                }
                // 处理
                for (j = k + 1; j < n; j++)
                    a[k][j] /= a[k][k];
                for (j = 0; j < n; j++)
                    b[k][j] /= a[k][k];
                a[k][k] = 1;
    
                for (j = k + 1; j < n; j++) {
                    for (i = 0; i < k; i++)
                        a[i][j] -= a[i][k] * a[k][j];
                    for (i = k + 1; i < n; i++)
                        a[i][j] -= a[i][k] * a[k][j];
                }
                for (j = 0; j < n; j++) {
                    for (i = 0; i < k; i++)
                        b[i][j] -= a[i][k] * b[k][j];
                    for (i = k + 1; i < n; i++)
                        b[i][j] -= a[i][k] * b[k][j];
                }
                for (i = 0; i < k; i++)
                    a[i][k] = 0;
                a[k][k] = 1;
            }
            // 恢复行列次序;
            for (j = 0; j < n; j++)
                for (i = 0; i < n; i++)
                    a[p[i]][j] = b[i][j];
        }
        
        //矩阵乘法
        public void Mrcheng(double[][] a,double[][] b,double[][]c,int m,int n,int l)
        { 
            double[][] d=new double[m][l];
            //使用中间变量d,是防止c=a或c=b的情形下计算出错
            int i,j,k;
            for(i=0;i<m;i++)
            for(j=0;j<l;j++)
            { 
                d[i][j]=0;
                for(k=0;k<n;k++)
                d[i][j]+=a[i][k]*b[k][j];
            }
            
            for(i=0;i<m;i++)
            for(j=0;j<l;j++)
            c[i][j]=d[i][j];
        }
        
        
        
        
    }
  • 相关阅读:
    自动换行的两种代码(C#)
    C#的SubString(int start,int end);
    php数组添加元素的方法
    php通过生成动态变量(变量名中还有变量)
    php定义空的数组
    php的$GLOBALS例子
    WINCRIS的使用
    java的PreparedStatement中使用like时的问题
    php发送get请求
    在HTML中使用object和embed标签插入视频
  • 原文地址:https://www.cnblogs.com/rojas/p/4607168.html
Copyright © 2011-2022 走看看