在 C 中获取 N x N 矩阵行列式
Getting N x N matrix determinant in C
我一直在尝试计算 N x N 矩阵行列式,所以这就是我到目前为止所得到的。如果它是 -378029970
的结果。我不知道发生了什么,因为如果我更改矩阵大小的 N 值,它可以正常工作并打印正确的结果 -20
。我调试了整个脚本,发现问题出在我更改 N 值时。我是 C 语言的新手,所以如果您能帮助我,我将不胜感激。谢谢!
void getCofactor(int q, int n, int matrix[][n], int temp[][n]) {
int i = 0;
int j = 0;
int p = 0;
for (int row = 0; row < n; row++) {
for (int col = 0; col < n; col++) {
if (row != p && col != q) {
temp[i][j++] = matrix[row][col];
if (j == n - 1) {
j = 0;
i++;
}
}
}
}
}
int determinante(int n, int matrix[][n]) {
int D = 0;
if (n == 1) {
return matrix[0][0];
}
int temp[n][n];
int sign = 1;
for (int f = 0; f < n; f++) {
getCofactor(f, n, matrix, temp);
D += sign * matrix[0][f] * determinante(n - 1, temp);
sign = -sign;
}
return D;
}
int main() {
int matrix[3][3] = { { 3, -2, 5}, { -2, 8, 10}, { 3, -2, 4 }};
int LINHA = 3;
printf("Determinante: %d", determinante(LINHA, matrix));
return 0;
}
问题是 temp
被定义为 int temp[n][n]
,但是这个矩阵的维度在传递给 determinante(n - 1, temp)
时不兼容。
您应该修改 temp
的定义以减小大小并修改 getCofactor
的原型以反映 matrix
和 temp
的实际尺寸。
这是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
void getCofactor(int q, int n, int matrix[][n], int temp[][n - 1]) {
int i = 0;
int j = 0;
int p = 0;
for (int row = 0; row < n; row++) {
for (int col = 0; col < n; col++) {
if (row != p && col != q) {
temp[i][j++] = matrix[row][col];
if (j == n - 1) {
j = 0;
i++;
}
}
}
}
}
int determinante(int n, int matrix[][n]) {
if (n == 1) {
return matrix[0][0];
}
int temp[n - 1][n - 1];
int sign = 1;
int D = 0;
for (int f = 0; f < n; f++) {
getCofactor(f, n, matrix, temp);
D += sign * matrix[0][f] * determinante(n - 1, temp);
sign = -sign;
}
return D;
}
int main() {
int matrix[3][3] = { { 3, -2, 5}, { -2, 8, 10}, { 3, -2, 4 } };
int LINHA = sizeof(matrix) / sizeof(matrix[0]);
printf("Determinante: %d\n", determinante(LINHA, matrix));
return 0;
}
我一直在尝试计算 N x N 矩阵行列式,所以这就是我到目前为止所得到的。如果它是 -378029970
的结果。我不知道发生了什么,因为如果我更改矩阵大小的 N 值,它可以正常工作并打印正确的结果 -20
。我调试了整个脚本,发现问题出在我更改 N 值时。我是 C 语言的新手,所以如果您能帮助我,我将不胜感激。谢谢!
void getCofactor(int q, int n, int matrix[][n], int temp[][n]) {
int i = 0;
int j = 0;
int p = 0;
for (int row = 0; row < n; row++) {
for (int col = 0; col < n; col++) {
if (row != p && col != q) {
temp[i][j++] = matrix[row][col];
if (j == n - 1) {
j = 0;
i++;
}
}
}
}
}
int determinante(int n, int matrix[][n]) {
int D = 0;
if (n == 1) {
return matrix[0][0];
}
int temp[n][n];
int sign = 1;
for (int f = 0; f < n; f++) {
getCofactor(f, n, matrix, temp);
D += sign * matrix[0][f] * determinante(n - 1, temp);
sign = -sign;
}
return D;
}
int main() {
int matrix[3][3] = { { 3, -2, 5}, { -2, 8, 10}, { 3, -2, 4 }};
int LINHA = 3;
printf("Determinante: %d", determinante(LINHA, matrix));
return 0;
}
问题是 temp
被定义为 int temp[n][n]
,但是这个矩阵的维度在传递给 determinante(n - 1, temp)
时不兼容。
您应该修改 temp
的定义以减小大小并修改 getCofactor
的原型以反映 matrix
和 temp
的实际尺寸。
这是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
void getCofactor(int q, int n, int matrix[][n], int temp[][n - 1]) {
int i = 0;
int j = 0;
int p = 0;
for (int row = 0; row < n; row++) {
for (int col = 0; col < n; col++) {
if (row != p && col != q) {
temp[i][j++] = matrix[row][col];
if (j == n - 1) {
j = 0;
i++;
}
}
}
}
}
int determinante(int n, int matrix[][n]) {
if (n == 1) {
return matrix[0][0];
}
int temp[n - 1][n - 1];
int sign = 1;
int D = 0;
for (int f = 0; f < n; f++) {
getCofactor(f, n, matrix, temp);
D += sign * matrix[0][f] * determinante(n - 1, temp);
sign = -sign;
}
return D;
}
int main() {
int matrix[3][3] = { { 3, -2, 5}, { -2, 8, 10}, { 3, -2, 4 } };
int LINHA = sizeof(matrix) / sizeof(matrix[0]);
printf("Determinante: %d\n", determinante(LINHA, matrix));
return 0;
}