矩阵的求逆

求行列式取自  C++递归方法计算n阶行列式_n阶行列式c++-CSDN博客

//求行列式
double det(int n, double *aa)//n为阶数,aa为矩阵,求行列式
{
    if (n == 1)
        return aa[0];
    double *bb = new double[(n - 1)*(n - 1)];//创建n-1阶的代数余子式阵bb
    int mov = 0;//判断行是否移动
    double sum = 0.0;//sum为行列式的值
    for (int arow = 0; arow<n; arow++) // a的行数把矩阵a(nn)赋值到b(n-1)
    {
        for (int brow = 0; brow<n - 1; brow++)//把aa阵第一列各元素的代数余子式存到bb
        {
            mov = arow > brow ? 0 : 1; //bb中小于arow的行,同行赋值,等于的错过,大于的加一
            for (int j = 0; j<n - 1; j++)  //从aa的第二列赋值到第n列
            {
                bb[brow*(n - 1) + j] = aa[(brow + mov)*n + j + 1];
            }
        }
        int flag = (arow % 2 == 0 ? 1: -1);//因为列数为0,所以行数是偶数时候,代数余子式为1.
        sum += flag* aa[arow*n] * det(n - 1, bb);//aa第一列各元素与其代数余子式积的和即为行列式
    }
    delete[]bb;
    return sum;
}
//矩阵乘法
QVector<QVector<double>> matrix_multiplication(QVector<QVector<double>> a, QVector<QVector<double>> b)
{
    int acols = a[0].size();
    int arows = a.size();
    int bcols = b[0].size();
    int brows = b.size();

    QVector<double> col(bcols,0);//构造一个初始大小为cols元素的向量。每个元素都用0值初始化。
    QVector<QVector<double>> ret(arows,col);//构造一个初始大小为rows元素的向量。每个元素都用col值初始化。
    if(acols != brows)
    {
        qDebug() << "矩阵无法相乘,返回空矩阵";
        ret.clear();
        return ret;
    }

    for(int i = 0; i < arows; i++)
    {
        for(int j = 0; j < bcols; j++)
        {
            double t = 0;
            for(int k = 0; k < acols; k++)
            {
                t = t + (a[i][k] * b[k][j]);
            }
            ret[i][j] = t;
        }
    }

    return ret;
}

//矩阵转置
QVector<QVector<double>> matrix_transpose(QVector<QVector<double>> &a)
{
    int cols = a[0].size();
    int rows = a.size();

    QVector<double> row(rows,0);//构造一个初始大小为cols元素的向量。每个元素都用0值初始化。
    QVector<QVector<double>> temp(cols,row);//构造一个初始大小为rows元素的向量。每个元素都用col值初始化。


    for(int i = 0; i < cols; i++)
    {
        for(int j = 0; j < rows; j++)
        {
            temp[i][j] = a[j][i];
        }
    }
    return temp;
}

//求逆矩阵
QVector<QVector<double>> Matrix_inverse(QVector<QVector<double>> &A)
{
    qDebug() << A;
    qDebug() << "__________________________________________";

    int cols = A[0].size();
    int rows = A.size();
    QVector<double> col(cols,0);//构造一个初始大小为cols元素的向量。每个元素都用0值初始化。
    QVector<QVector<double>> res(rows,col);//构造一个初始大小为rows元素的向量。每个元素都用col值初始化。
    if(cols==1 && rows==1)
    {
        res[0][0] = 1/A[0][0];
        return res;
    }
    int i,j,k,l,m,n;
//    double temp,temp2;
    double temp[cols*rows];
    double temp2[(cols-1)*(rows-1)];
    QVector<double> var;
    var.clear();
//    qDebug() << "var内有多少元素:" << var.length();

    //求代数余子式
//    qDebug() << "rows:" << rows;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < rows; j++)
        {
            for (k = 0; k < rows; k++)
            {
                for (l = 0; l < rows; l++)
                {
                    if(k != i && l != j)
                    {
//                        qDebug() << "A的值" << A[k][l];
                        var.append(A[k][l]);
                    }
                }
            }
//            qDebug() << "var内有多少元素:" << var.length();
            for(m = 0; m < var.length(); m++)
            {
                temp2[m] = var[m];
            }
            var.clear();
//            qDebug() << "det(cols-1,temp2):" << det(cols-1,temp2);
            res[i][j] = pow(-1,i+j)*det(cols-1,temp2);
        }
    }
    //矩阵转置
    res = matrix_transpose(res);
    //求逆矩阵
    //求A的行列式
    for(m = 0; m < rows; m++)
    {
        for(n = 0; n < cols; n++)
        {
            temp[m*cols+n] = A[m][n];
        }
    }
//    qDebug() << "det(cols,temp):" << det(cols,temp);
    double determinant = det(cols,temp);
    for(m = 0; m < rows; m++)
    {
        for(n = 0; n < cols; n++)
        {
            res[m][n] = res[m][n]/determinant;
        }
    }

    qDebug() << res;
    qDebug() << "__________________________________________";

    return res;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值