寻找逆矩阵

3

我想要找到XYZ转LMS颜色空间矩阵的逆矩阵。在查找后,我发现processing有一个转置函数。但是我知道矩阵的转置并不总是等于它的逆矩阵。我可以手动计算逆矩阵,但是processing是否有内置函数来实现这一点,或者是否已经有人找到了一种方法并愿意分享?

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

你是否正在寻找用于转置xyz2lms的代码? - SMA
1
我正在寻找xyz2lms的逆。但是如果转置等于逆,那么我会采用并使用它。问题是我不确定何时转置等于逆。 - Will
2个回答

1

对于颜色矩阵来说,转置不同于求逆,因为它们不是正交的(M转置乘以M等于I)。

Processing有一些库可以求矩阵的逆: 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)。这可能比任何预制解决方案更快,并且使用的内存更少!


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接