寻找矩阵的行列式
Finding the determinant of a matrix
我正在开发一个程序,我必须编写一个方法来找到矩阵的行列式,但我遇到了一些麻烦。这是我目前所拥有的。
public Matrix determinant() {
Matrix determinantM = new Matrix(this.rows, this.columns);
for(int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
determinantM.data[r][c] = this.data[r][c];
}
}
Matrix x = (determinantM.data[1][1] * determinantM.data[2][2]) - (determinantM.data[2][1] * determinantM.data[1][2]);
Matrix y = (determinantM.data[1][0] * determinantM.data[2][2]) - (determinantM.data[2][0] * determinantM.data[1][2]);
Matrix z = (determinantM.data[1][0] * determinantM.data[2][1]) - (determinantM.data[2][0] * determinantM.data[1][1]);
Matrix newD = (determinantM.data[0][0] * x) - (determinantM.data[0][1] * y) + (determinantM.data[0][2] * 2);
return newD;
}
这就是我试图从 main
中调用它的方式
Matrix z = new Matrix(new double[][]{{1, 2, 3},{0, 4, 5},{1, 0, 6}});
Matrix v = z.determinant();
System.out.println("v:\n" + v);
我不确定这是否是解决此问题的正确方法,或者我的代码中是否存在一些错误。如果有任何帮助,我将不胜感激。
如所述 here 计算 3x3 矩阵的行列式,如:
a b c
d e f
g h i
行列式将为:
|A| = a(ei − fh) − b(di − fg) + c(dh − eg)
因此,您的这部分代码:
Matrix x = (determinantM.data[1][1] * determinantM.data[2][2]) - (determinantM.data[2][1] * determinantM.data[1][2]);
Matrix y = (determinantM.data[1][0] * determinantM.data[2][2]) - (determinantM.data[2][0] * determinantM.data[1][2]);
Matrix z = (determinantM.data[1][0] * determinantM.data[2][1]) - (determinantM.data[2][0] * determinantM.data[1][1]);
实际上应该是:
double x=(determinantM.data[0][0] * (determinantM.data[1][1] * determinantM.data[2][2] – determinantM.data[1][2] * determinantM.data[2][1]));
double y=(determinantM.data[0][1] * (determinantM.data[1][0] * determinantM.data[2][2] – determinantM.data[1][2] * determinantM.data[2][0]));
double z=(determinantM.data[0][2] * (determinantM.data[1][0] * determinantM.data[2][1] – determinantM.data[1][1] * determinantM.data[2][0]));
那么确定的就是x - y + z
;
所以你最终的方法应该是这样的:
public double determinant() {
double x=(determinantM.data[0][0] * (determinantM.data[1][1] * determinantM.data[2][2] – determinantM.data[1][2] * determinantM.data[2][1]));
double y=(determinantM.data[0][1] * (determinantM.data[1][0] * determinantM.data[2][2] – determinantM.data[1][2] * determinantM.data[2][0]));
double z=(determinantM.data[0][2] * (determinantM.data[1][0] * determinantM.data[2][1] – determinantM.data[1][1] * determinantM.data[2][0]));
return x - y + z;
}
由于您没有修改原始矩阵,因此不需要复制它。
这段代码自然只适用于矩阵3x3
。
我正在开发一个程序,我必须编写一个方法来找到矩阵的行列式,但我遇到了一些麻烦。这是我目前所拥有的。
public Matrix determinant() {
Matrix determinantM = new Matrix(this.rows, this.columns);
for(int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
determinantM.data[r][c] = this.data[r][c];
}
}
Matrix x = (determinantM.data[1][1] * determinantM.data[2][2]) - (determinantM.data[2][1] * determinantM.data[1][2]);
Matrix y = (determinantM.data[1][0] * determinantM.data[2][2]) - (determinantM.data[2][0] * determinantM.data[1][2]);
Matrix z = (determinantM.data[1][0] * determinantM.data[2][1]) - (determinantM.data[2][0] * determinantM.data[1][1]);
Matrix newD = (determinantM.data[0][0] * x) - (determinantM.data[0][1] * y) + (determinantM.data[0][2] * 2);
return newD;
}
这就是我试图从 main
中调用它的方式 Matrix z = new Matrix(new double[][]{{1, 2, 3},{0, 4, 5},{1, 0, 6}});
Matrix v = z.determinant();
System.out.println("v:\n" + v);
我不确定这是否是解决此问题的正确方法,或者我的代码中是否存在一些错误。如果有任何帮助,我将不胜感激。
如所述 here 计算 3x3 矩阵的行列式,如:
a b c
d e f
g h i
行列式将为:
|A| = a(ei − fh) − b(di − fg) + c(dh − eg)
因此,您的这部分代码:
Matrix x = (determinantM.data[1][1] * determinantM.data[2][2]) - (determinantM.data[2][1] * determinantM.data[1][2]);
Matrix y = (determinantM.data[1][0] * determinantM.data[2][2]) - (determinantM.data[2][0] * determinantM.data[1][2]);
Matrix z = (determinantM.data[1][0] * determinantM.data[2][1]) - (determinantM.data[2][0] * determinantM.data[1][1]);
实际上应该是:
double x=(determinantM.data[0][0] * (determinantM.data[1][1] * determinantM.data[2][2] – determinantM.data[1][2] * determinantM.data[2][1]));
double y=(determinantM.data[0][1] * (determinantM.data[1][0] * determinantM.data[2][2] – determinantM.data[1][2] * determinantM.data[2][0]));
double z=(determinantM.data[0][2] * (determinantM.data[1][0] * determinantM.data[2][1] – determinantM.data[1][1] * determinantM.data[2][0]));
那么确定的就是x - y + z
;
所以你最终的方法应该是这样的:
public double determinant() {
double x=(determinantM.data[0][0] * (determinantM.data[1][1] * determinantM.data[2][2] – determinantM.data[1][2] * determinantM.data[2][1]));
double y=(determinantM.data[0][1] * (determinantM.data[1][0] * determinantM.data[2][2] – determinantM.data[1][2] * determinantM.data[2][0]));
double z=(determinantM.data[0][2] * (determinantM.data[1][0] * determinantM.data[2][1] – determinantM.data[1][1] * determinantM.data[2][0]));
return x - y + z;
}
由于您没有修改原始矩阵,因此不需要复制它。
这段代码自然只适用于矩阵3x3
。