2014-12-21 267 views
3

我想找到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(); 
}; 
+0

你正在寻找代码来做转置的xyz2lms? – SMA

+1

我正在寻找xyz2lms的逆。但如果转置等于反转,那么我会采取并使用它。事情是Im不知道什么时候tranpose =反转。 – Will

回答

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)。这可能会比任何预先制作的解决方案更快并且使用更少的内存!

+0

我查找了一个关于如何找到矩阵逆的YouTube教程。我在纸上做了我的计算。有了这个,我现在可以用你说的几行代码来完成它。当我不想手动计算矩阵逆时,你给我的是完美的将来使用。谢谢 – Will

-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; 
    } 
}