编程求解矩阵的行列式

求解矩阵的行列式(c++描述)

新学期开始,学习了有关C++面向对象编程的内容,实现一个矩阵类,练练手,顺便复习一下上学期有关递归和线性代数方面的知识.

下面是一个矩阵类的头文件

class Matrix
{
public:
        Matrix();
        Matrix(const Matrix& m)//拷贝构造函数
        Matrix(double *p, int r, int c)//构造函数,形参分别为用一维数组存储的矩阵以及它的行和列
        ~Matrix();//涉及动态内存分配需要自定义析构函数;
        void print_mat();//打印整个矩阵
        int get_row();
        int get_col();
        double* get_mat();
private:
        int row;
        int col;
        double *mat;
}

求解矩阵的行列式一般有两种方法:

第一种主要的思想是通过矩阵变化将所求的矩阵化成三角矩阵,再求解三角矩阵的行列式(对角线上的元素的乘积);
第二种方法是利用余因子展开的方法来求解
detA=a11detA11a12detA12+....(1)1+na1ndetA1n=nj=1(1)1+na1jdetA1j
显然第二种方法可以在计算机中用递归来实现

int det_matrix(Matrix& mat, int row)//可以求解行列式的必为反正,所以只传入行数即可
{
    if(row == 2)
    //当递归到一个二维矩阵时我们可以直接求解行列式
    {
        double* arr = mat.get_mat();
        return arr[0 * row + 0] * arr[1 * row + 1] - arr[0 * row + 1] * arr[1 * row + 0];
        //用一维数组,存储arr[(所在行数 - 1)* mat_row + 所在列数] 即代表第0行
    }
    else
    //递归步骤 -- 每个小问题的解决方法
    {
        double res = 0;
        double *vec = mat.get_mat();
        for(int i = 0; i < row; i++)
        //为方便编写程序,每个矩阵都由第一行展开
        {
            int k = 1;
            if(i % 2 == 1)
            {
                k = -1;
            }
            Matrix new_mat = remove_row_col(mat,1, i + 1);
            //remove_row_col()返回一个去掉特定行和列的矩阵;
            res += vec[i] * k * det(new_mat,row - 1);   
        }
        return res;
    }

    Matrix remove_row_col(Matrix &m,int row, int col)
    {
        int old_row = m.get_row();
        int old_col = m.get_col();
        int new_row = m.get_row() - 1;
        int new_col = m.get_col() - 1;
        double *arr = m.get_mat();
        double new_mat = new double[(new_row  * new_col];
        int old_size = old_row * old_col;
        int j = 0;
        for(int i = 0; i < old_size; i++)
        //遍历原来的矩阵
        {
            if(i %  old_col== col  - 1 || i / old_col == row - 1)
            //去除掉处于所在列和行的元素
            {
                continue;
            }
            else
            {
                new_mat[j++] = arr[i]
            }
        }
        Matrix new_matrix(new_mat,new_row,new_col);
        return new_matrix;
    }
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用行列式性质求解行列式通常可以通过如下几个步骤进行: 1. 确定行列式的阶数:行列式的阶数是指行列式的行数和列数相等的数目。例如,一个3阶行列式有3行和3列。 2. 根据行列式的定义:行列式是一个数学工具,用于计算矩阵的性质。行列式的值可以通过以下公式计算: - 对于2阶行列式: | a b | | c d | 行列式的值等于 ad - bc。 - 对于3阶行列式: | a b c | | d e f | | g h i | 行列式的值等于 aei + bfg + cdh - ceg - bdi - afh。 - 对于更高阶的行列式,可以使用展开定理进行计算。展开定理是将行列式按照某一行或某一列展开成多个次级行列式的和。在计算次级行列式时,可以继续使用展开定理,直到得到2阶行列式为止。 3. 利用行列式的性质简化计算:行列式有一些性质可以用来简化计算,例如行列式的性质之一是,如果行列式的某一行(或某一列)中所有元素都是0,则该行列式的值为0。此外,行列式的值不受行列互换的影响,即交换行或列的位置不会改变行列式的值。 4. 使用计算工具或编程语言进行计算:行列式的计算可以手动进行,但对于高阶行列式而言,计算过程可能较为复杂和繁琐。因此,可以使用一些计算工具或编程语言进行行列式的计算,例如Matlab、Python中的NumPy等。 综上所述,利用行列式性质求解行列式可以通过确定阶数、应用行列式的定义和性质、以及使用适当的计算工具或编程语言来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值