【问题标题】:I'm getting error in my c++ code! & How to find determinant and inverse of matrix in c++?我的 C++ 代码出错了! & 如何在 C++ 中找到矩阵的行列式和逆矩阵?
【发布时间】:2019-07-08 15:55:26
【问题描述】:

我正在尝试制作矩阵计算器。其中我几乎完成了矩阵所需的所有操作。所以现在我正在尝试编写代码来查找矩阵的行列式和逆矩阵,但是我得到了如下错误:- “int”类型的参数与“double(*)[100]”类型的参数不兼容

我正在使用 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;
};

【问题讨论】:

  • 错误信息有什么不清楚的地方? 显然您不能将int 传递给期望double(*)[100] 的函数。

标签: c++ matrix calculator inverse


【解决方案1】:

您将 submat 的第 (i,j) 个元素传递给 dat()。

submat[i][j] 是一个整数。但是 dat() 函数需要一个二维的双精度数组(第二维是 100,所以即使替换它只是

dat(n-1, submat)

不会是正确的

【讨论】:

    【解决方案2】:

    除了编译错误之外,您的代码还有几个问题。

    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) 返回值应该是double 而不是int

    5) 条件if (j == c) 应该是if (j == p),因为p 是我们要排除的行/列。

    6) i 循环应该从 1 开始,因为我们没有在子矩阵中包含第一行/列。

    7) s1rc 从未使用过,可以删除。

    8) 返回值应该是det

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多