我想找到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 :(得分: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;
}
}