矩阵c ++的行列式

时间:2016-01-04 10:27:50

标签: c++ dynamic-memory-allocation

我的名字是Daniele,我是C++初学者。在这个时期,我正在尝试改进指针,递归函数和动态内存分配。 出于这个原因,我写了一个代码来找到方阵的行列式。 这段代码似乎可以完成它的工作但是给我一些问题。当我完成代码时,使用5x5矩阵的测试程序崩溃了;然后我将函数的返回值和DET变量从int更改为double。事情似乎变得更好但是当我用5x5身份进行测试时,程序再次崩溃,我不知道为什么。 另一个问题,我必须首先纠正最后一个调用递归函数的if-else控制语句是

if (dyn_dim > 3) 
{
    DET = DET + coeff*funz_det (temp, (dyn_dim-1));
}
else
{
    return (temp[0][0]*temp[1][1]-temp[0][1]*temp[1][0]); 
}

我在网上看过这个,但是因为我的代码不起作用。 为什么如果我把DET变量作为外部变量,代码也不起作用? 最后但并非最不重要的。我以你能看到的方式递归调用函数,但是在if-else contro语句中编写递归函数体是否更好?或者它是否相同? 我不想为行列式本身编写此算法,而是针对涉及的技能。 非常感谢大家 (我提前为我的英语道歉)

#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;

double funz_det (int **a, int dyn_dim) // dyn_dim: the dynamic dimension created for sub-matrix
{
    double DET = 0;
    /*Create dynamically the new sub-matrix*/
    int **temp;
    temp = new int*[dyn_dim-1];
    for(int i=0; i<dyn_dim; i++)
    {
        temp[i] = new int[dyn_dim-1];
    }
    //////////////////////////////////////

    int coeff = 0;
    int BR = 0;
    int BC = 0;
    int row_index = 0;
    int column_index = 0;
    for (BC = 0; BC != dyn_dim; BC++)
    {
        for (int i=0; i<dyn_dim; i++)
        {
            for (int j=0; j<dyn_dim; j++)
            {
                if (i==BR && j==BC)
                {
                    coeff = a[i][j];
                    int esp = i+j;
                    coeff = pow(-1,esp)*coeff;
                    row_index--;
                }
                if (i!=BR && j!=BC)
                {
                    temp[row_index][column_index] = a[i][j];                                     
                    column_index++;
                }
            }
            column_index = 0;    
            row_index++;     
        }
        row_index = 0;
        if (dyn_dim > 3) 
        {
            DET = DET + coeff*funz_det (temp, (dyn_dim-1));
        }
        else
        {
            DET = DET + coeff*(temp[0][0]*temp[1][1]-temp[0][1]*temp[1][0]);             
        }
    }
    return DET;
}

int main()
{
    int dimension = 0;

    cout << "Please insert the matrix dimension:  ";
    cin >> dimension;

    cout << endl << endl;

    int **A;
    A = new int*[dimension];
    for(int d=0; d<dimension; d++)
    {
        A[d] = new int[dimension];
    }

    for (int i=0; i<dimension; i++)
    {
        for(int j=0; j<dimension; j++)
        {
            cout << "Please insert the element A[" << i << "][" << j << "] =  ";            
            cin >> A[i][j];
        }
    }

    cout << endl << endl;

    for (int display_row=0; display_row<dimension; display_row++)
    {
        for(int display_column=0; display_column<dimension; display_column++)       
        {
            cout << A[display_row][display_column] << "  ";
        }
        cout << endl << endl;
    } 

    cout << endl << endl;
    cout << "Determinant Value = " << funz_det(A,dimension)  <<  endl;

    system ("PAUSE");
    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

您的代码崩溃是C ++中的一个常见方面,并且通常在您启动时。问题是你没有删除动态指针。在功能开始时查看何时创建子矩阵?好吧,你在指针上使用'new',当然这是正确的,但你总是应该在指针离开范围之前使用'delete'来销毁你用'new'创建的任何指针。如果你不这样做,你将有内存泄漏,并且运行中崩溃错误是被遗忘的指针的正常症状......