我的 C++ 代码出错了! &如何在C ++中找到矩阵的行列式和逆矩阵?
I'm getting error in my c++ code! & How to find determinant and inverse of matrix in c++?
我正在尝试制作矩阵计算器。其中我几乎完成了矩阵中需要的所有操作。所以现在我正在尝试编写代码来查找矩阵的行列式和逆矩阵,但我得到的错误如下:- “int”类型的参数与“double(*)[100]”类型的参数不兼容。 =14=]
我正在使用 Visual Studio 2019。
int dat(int n, double mat[100][100]) //function
{
Matrix s1;
double det = 0;
int p, r, c, subi, i, j, subj;
int submat[10][10];
s1.getmatrix1();
r = c = n;
if (n == 2)
return((mat[0][0] * mat[1][1]) * (mat[1][0] * mat[0][1]));
else
{
for (p = 0; p < n; p++)
{
subi = 0;
for (i = 0; i < n; i++)
{
subj = 0;
for (j = 0; j < n; j++)
{
if (j == c)
continue;
submat[subi][subj] = mat[i][j];
subj++;
}
subi++;
}
det = det + (pow(-1, p) * mat[0][p] * dat(n - 1, submat[i][j])); //here at 'submat' i'm getting that error.
}
}
return 0;
};
您正在将 submat 的第 (i,j) 个元素传递给 dat()。
submat[i][j] 是一个整数。但是 dat() 函数需要一个二维双精度数组(第二个维度是 100,所以即使用
替换它
dat(n-1, submat)
不会正确
除了编译错误之外,您的代码还有一些问题。
1) 因为 dat
期望第二个参数是一个数组,函数调用应该是:
det = det + (pow(-1, p) * mat[0][p] * dat(n - 1, submat));
2) 2x2 矩阵的行列式应按如下方式计算:
return((mat[0][0] * mat[1][1]) - (mat[1][0] * mat[0][1]));
3) int submat[10][10]
应该是 double submat[100][100]
因为它需要能够包含(几乎)与 mat
一样多的元素并且应该存储相同的数据类型。
4) return 值应该是 double
而不是 int
.
5) 条件 if (j == c)
应该是 if (j == p)
因为 p
是我们要排除的 row/column。
6) i
循环应该从 1 开始,因为我们不包括子矩阵中的第一个 row/column。
7) s1
、r
和 c
从未使用过,可以删除。
8) return 值应为 det
注:该算法的时间复杂度,称为Laplace Expansion, is O(n!)
(see here)。如果您想将它用于生产代码,我强烈建议您使用基于矩阵分解的更高效的算法。
我正在尝试制作矩阵计算器。其中我几乎完成了矩阵中需要的所有操作。所以现在我正在尝试编写代码来查找矩阵的行列式和逆矩阵,但我得到的错误如下:- “int”类型的参数与“double(*)[100]”类型的参数不兼容。 =14=]
我正在使用 Visual Studio 2019。int dat(int n, double mat[100][100]) //function
{
Matrix s1;
double det = 0;
int p, r, c, subi, i, j, subj;
int submat[10][10];
s1.getmatrix1();
r = c = n;
if (n == 2)
return((mat[0][0] * mat[1][1]) * (mat[1][0] * mat[0][1]));
else
{
for (p = 0; p < n; p++)
{
subi = 0;
for (i = 0; i < n; i++)
{
subj = 0;
for (j = 0; j < n; j++)
{
if (j == c)
continue;
submat[subi][subj] = mat[i][j];
subj++;
}
subi++;
}
det = det + (pow(-1, p) * mat[0][p] * dat(n - 1, submat[i][j])); //here at 'submat' i'm getting that error.
}
}
return 0;
};
您正在将 submat 的第 (i,j) 个元素传递给 dat()。
submat[i][j] 是一个整数。但是 dat() 函数需要一个二维双精度数组(第二个维度是 100,所以即使用
替换它dat(n-1, submat)
不会正确
除了编译错误之外,您的代码还有一些问题。
1) 因为 dat
期望第二个参数是一个数组,函数调用应该是:
det = det + (pow(-1, p) * mat[0][p] * dat(n - 1, submat));
2) 2x2 矩阵的行列式应按如下方式计算:
return((mat[0][0] * mat[1][1]) - (mat[1][0] * mat[0][1]));
3) int submat[10][10]
应该是 double submat[100][100]
因为它需要能够包含(几乎)与 mat
一样多的元素并且应该存储相同的数据类型。
4) return 值应该是 double
而不是 int
.
5) 条件 if (j == c)
应该是 if (j == p)
因为 p
是我们要排除的 row/column。
6) i
循环应该从 1 开始,因为我们不包括子矩阵中的第一个 row/column。
7) s1
、r
和 c
从未使用过,可以删除。
8) return 值应为 det
注:该算法的时间复杂度,称为Laplace Expansion, is O(n!)
(see here)。如果您想将它用于生产代码,我强烈建议您使用基于矩阵分解的更高效的算法。