寻找逆矩阵

时间:2014-12-21 14:24:14

标签: java matrix processing

我想找到XYZ到LMS颜色空间矩阵的逆矩阵。环顾四周后,我发现处理具有转置功能。但我知道矩阵的转置并不总是等于逆。我可以找出一种手动计算逆的方法,但是处理中是否有任何内置函数,或者有没有人已经想出办法做到这一点而不介意分享?

float []lms2xyzConverter(float[] lmsVals){               

   //Normalized to D65
   float[][]xyz2lms =  {   {0.4002 , 0.7076 , -0.0808},           
                           {-0.2263 , 1.1653 , 0.0457},       
                           {0.00000 , 0.00000 , 0.9182} }; 

   float [][]lms2xyz = xyz2lms.transpose();
}; 

2 个答案:

答案 0 :(得分:1)

转置与颜色矩阵的反转不同,因为它们不是正交的(M transpose times M = I

有一些处理库可以反转矩阵: http://adilapapaya.com/papayastatistics/

float[][] invA = Mat.inverse(A);

或者,有大量的Java矩阵库,您可以使用它们,例如: https://code.google.com/p/efficient-java-matrix-library/

但是,由于您只需要3D矩阵求逆,您可以使用9行代码手动反转它们,每行代码都有相应的公式(参见http://www.wikihow.com/Inverse-a-3X3-Matrix)。这可能会比任何预制解决方案更快,使用更少的内存!

答案 1 :(得分:-1)

希望下面开发的代码可能对您有用

package com.test.testprogramms;

/**
 * 
 * @author bhavikambani
 *
 */
public class Matrix {

    private int nrows;
    private int ncols;
    private double[][] data;

    public Matrix(double[][] dat) {
        this.data = dat;
        this.setNrows(dat.length);
        this.setNcols(dat[0].length);
    }

    public Matrix(int nrow, int ncol) {
        this.setNrows(nrow);
        this.setNcols(ncol);
        data = new double[nrow][ncol];
    }

    public int getNcols() {
        return ncols;
    }

    public void setNcols(int ncols) {
        this.ncols = ncols;
    }

    public int getNrows() {
        return nrows;
    }

    public void setNrows(int nrows) {
        this.nrows = nrows;
    }

    public double getValueAt(int i, int j) {
        return data[i][j];
    }

    public void setValueAt(int i, int j, double valueToBeSet){
        data[i][j] = valueToBeSet;
    }
}

以下是实用工具类,

package com.test.testprogramms;

/**
 * 
 * @author bhavikambani
 *
 */
public class MatrixUtil {

    public static Matrix transpose(Matrix matrix) {
        Matrix transposedMatrix = new Matrix(matrix.getNcols(), matrix.getNrows());
        for (int i = 0; i < matrix.getNrows(); i++) {
            for (int j = 0; j < matrix.getNcols(); j++) {
                transposedMatrix.setValueAt(j, i, matrix.getValueAt(i, j));
            }
        }
        return transposedMatrix;
    }
}