我的 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) s1rc 从未使用过,可以删除。

8) return 值应为 det

注:该算法的时间复杂度,称为Laplace Expansion, is O(n!) (see here)。如果您想将它用于生产代码,我强烈建议您使用基于矩阵分解的更高效的算法。