难以找到矩阵的行列式的函数

问题描述 投票:0回答:1

可能是一个简单的修复程序,但是当我本应达到22岁时,我始终将0用作确定值,我也必须使用动态内存分配。使用浮点数可能会出现一些问题,因为我对它们与指针的工作方式并不完全熟悉。老实说,不知道是什么导致函数输出零。

cpp.sh链接进行测试:http://cpp.sh/5bu2v

#include <iostream>
#include <math.h>
using namespace std;

float determinant(float *mat1, int &rows1)
{
    float s = 1, D = 0;
    float *temp = new float[rows1 * rows1];
    int i, j, m, n, c;
    if (rows1 == 1)
    {
        return (*(mat1 + 0 * rows1 + 0));
    }
    else
    {
        D = 0;
        for (c = 0; c < rows1; c++)
        {
            m = 0;
            n = 0;
            for (i = 0; i < rows1; i++)
            {
                for (j = 0; j < rows1; j++)
                {
                    *(temp + i * rows1 + j) = 0;
                    if (i != 0 && j != c)
                    {
                        *(temp + m * rows1 + n) = *(mat1 + i * rows1 + j);
                        if (n < (rows1 - 2))
                            n++;
                        else
                        {
                            n = 0;
                            m++;
                        }
                    }
                }
            }
            int V1 = rows1 - 1;
            D = D + s * (*(mat1 + 0 * rows1 + c) * determinant(temp, V1));
            s = -1 * s;
        }
    }
    return (D);
}


int main()
{
    int i, j;
    int n = 3;

    int matrix[10][10] = {{1, 2, 3},
                          {0, 4, 5},
                          {1, 0, 6}};
    float *mat1 = new float[n * n];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            *(mat1 + i * n + j) = matrix[i][j];
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            cout << matrix[i][j] << " ";

        cout << endl;
    }

    cout << "Determinant of the matrix is " << determinant(mat1, n);
    return 0;
}
c++ matrix types dynamic-memory-allocation
1个回答
0
投票

[您对determinant的首次调用,mat是存储在1维数组中的3x3矩阵。像这样可视化:

A B C
D E F
G H I

您创建另一个3x3矩阵temp

您填充temp矩阵的一系列循环不包括第一行和第一列c,因此它第一次看起来像这样:

D E 0
G H 0
0 0 0

这将传递给determinant,后者需要一个[[2x2矩阵。由于您已经传递了其他内容,因此递归调用看到的是

D E 0 G
构造temp时,需要使用较小的矩阵尺寸,而不是源尺寸。
© www.soinside.com 2019 - 2024. All rights reserved.