我选择第一行并将每个元素乘以其辅助因子,
但在某些情况下,该方法返回nan
。
例如,
1 0 0 1
0 2 0 0
0 0 3 0
0 0 0 4
在这种情况下,该方法返回nan
。
有谁知道我做错了什么?
getDet3
返回3x3矩阵的行列式,并且工作正常。
-(double) getDet4:(double[4][4])mat {
double det = 0;
double small[3][3];
int i, j, k;
int i_ = 1, j_;
for ( i=0; i<4; i++ ){
if (mat[0][i] == 0) continue;
// get the small matrix here
for ( j=0; j<3; j++ ){
j_ = 0;
for ( k=0; k<3; k++ ){
if ( i == j_ ) j_++;
small[j][k] = mat[i_][j_];
j_++;
}
i_++;
}
det += mat[0][i] * [self getDet3:small] * pow(-1, i+j);
}
return det;
}
答案 0 :(得分:0)
就个人而言,我发现你的变量名称令人困惑。如果我理解您的想法,您希望i_
的值j + 1
和j_
为k < i ? k : k + 1
。恕我直言,如果将它们命名为j_p and
k_`,或者甚至只使用等效表达式,就不那么容易混淆了。
无论如何,您不会在外部for循环内重新初始化i_
。所以它实际上只是继续递增,导致数组边界之外的数组索引。
答案 1 :(得分:0)
嗯,你的代码中有一些错误。
1)i_ = 1
的初始化应该在j
循环之前完成,否则它将保留旧值。
2)pow(-1, i+j)
的计算应仅取决于i
,因为j
每次在该表达式中具有相同的值(即3)。
因此,假设getDet3
是正确的,i_
超出界限就会引入错误。整体而言,代码应如下所示:
-(double) getDet4:(double[4][4])mat {
double det = 0;
double small[3][3];
int i, j, k;
int i_, j_;
for ( i=0; i<4; i++ ){
if (mat[0][i] == 0) continue;
// get the small matrix here
i_ = 1;
for ( j=0; j<3; j++ ){
j_ = 0;
for ( k=0; k<3; k++ ){
if ( i == j_ ) j_++;
small[j][k] = mat[i_][j_];
j_++;
}
i_++;
}
det += mat[0][i] * [self getDet3:small] * pow(-1, i);
}
return det;
}