【问题标题】:Finding inverse matrix求逆矩阵
【发布时间】:2014-12-21 14:24:13
【问题描述】:

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

【问题讨论】:

  • 您是否正在寻找代码来对 xyz2lms 进行转置?
  • 我正在寻找 xyz2lms 的倒数。但是,如果转置等于倒数,那么是的,我会采用并使用它。问题是我不确定何时转置 = 逆。

标签: java matrix processing


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

【讨论】:

  • 我在 youtube 上查找了有关如何求逆矩阵的教程。我在纸上做了我的计算。有了这个,我现在可能可以像你说的那样用几行代码来做到这一点。当我不想手动计算矩阵逆时,您给我的内容非常适合将来使用。谢谢
【解决方案2】:

希望下面开发的代码对你有用

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

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 2011-08-30
    • 1970-01-01
    • 2017-11-24
    • 2013-11-11
    • 2014-09-02
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多