首页 > 其他分享 >求解一个行列式的值

求解一个行列式的值

时间:2024-06-02 09:44:05浏览次数:14  
标签:cout temp 求解 一个 det ++ int 行列式

求一个行列式的值

问题描述:

输入一个行列式的阶数,再按行输入这个行列式,再计算出它的值。

解法:

存储一个行列式可以使用一个nn列的数组。使用双重for循环按行输入行列式的值即可。

cout << "请输入行列式的阶数:" << endl;
cin >> n;
cout << "请按行输入一个行列式:" << endl;
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        cin >> det[i][j];
    }
}

接下来以下列这个行列式为例:

\[\left| \begin{array}{cccc} 1 & 1 & 4 \\ 5 & 1 & 4\\ 1 & 9 & 1 \end{array} \right| \]

解行列式,使用行列的性质将其化成一个上三角行列式来求解:(为了程序实现方便,这里采用自顶向下把当前列元素化成0的方法)

  • 将第1行第0列(det[1][0])的元素置0利用第0行第0列的元素置为0,求出这个系数temp,然后让det[1][0] += temp * det[0][0],对当前行的其他列也要做此处理,故有:

    //把第1行第0列变成0
    temp = -det[1][0] / det[0][0];	//temp == -5
    det[1][0] += det[0][0] * temp;	//det[1][0] == 1 * (-5) + 5 == 0
    det[1][1] += det[0][1] * temp;	//det[1][1] == 1 + (-5) + 1 == -4
    det[1][2] += det[0][2] * temp;	//det[1][2] == 4 * (-5) + 4 = -16
    
  • 再求第2行

    //把第2行第0列变成0
    temp = -det[2][0] / det[0][0];	//temp == -1
    det[2][0] += det[0][0] * temp;	//det[2][0] == 1 * (-1) + 1 == 0
    det[2][1] += det[0][1] * temp;	//det[2][1] == 1 *(-1) + 9 == 8
    det[2][2] += det[0][2] * temp;	//det[2][2] == 4 * (-1) + 1 == -3
    
  • 当前列完毕,利用第1行第1列,将第1行以后(第2行),第1列的元素置为0

    temp = -det[2][1] / det[1][1];
    det[2][0] += det[1][0] * temp;	//det[2][0] == 0
    det[2][1] += det[1][1] * temp;	//det[2][1] == 0
    det[2][2] += det[1][2] * temp;	//det[2][2] == -35
    
  • 得到主对角线的元素,将其相乘

    det[0][0] == 1;
    det[1][1] == -4;
    det[2][2] == -35;
    
    //结果
    result == 1 * (-4) * (-35);
    

将上述推导过程抽象化得:

  • det[j][j]det[j+1...n][j]置成0,得到一个上三角行列式

    //以列为准遍历数组
    for (int j = 0; j < n; j++)
    {
        for (int i = j + 1; i < n; i++)
        {
            //分别未出由det[j][j]可将第[j + 1, n - 1][j]列置为0的系数temp
            temp = -det[i][j] / det[j][j];
    
            for (int k = 0; k < n; k++)
            {
                //操作当前行其他列
                det[i][k] += temp * det[j][k];
            }
        }
    }
    
  • 但是如果首行首列为0的话,这样会出错,所以需要做一个换行的操作,使用flag变量记录交换的状态,奇数次置为-1,偶数次为1,最后让主对角线的积,与其相乘:

    double temp;
    
    int flag = 1;
    for (int j = 0; j < n; j++)
    {
        for (int i = j + 1; i < n; i++)
        {
            //处理首行首列的0行
            if (det[0][0] == 0)
            {
                //当前行,所有列,找到第一个非0的元素就交换
                for (int i = 0; i < n; i++)
                {
                    //当前行第一个非0元素,i为其所在行
                    if (det[i][0] != 0)
                    {
                        //交换两行
                        for (int j = 0; j < n; j++)
                        {
                            int temp = det[i][j];
                            det[i][j] = det[0][j];
                            det[0][j] = temp;
                        }
                        //每次交换之后符号变负
                        flag = -flag;
                        //防止多次交换
                        break;
                    }
                }
            }
            //分母不能为0
            else
            {
                //从当前列自顶向下变0
                temp = -det[i][j] / det[j][j];
    
                for (int k = 0; k < n; k++)
                {
                    det[i][k] += temp * det[j][k];
                }
            }
        }
    }
    
    //主对角相乘再乘以一个符号
    double result = 1;
    for (int i = 0; i < n; i++)
    {
        result *= det[i][i] * flag;
    }
    

综上:

#include <iostream>
#define MAX 114
using namespace std;

//描述det
double det[MAX][MAX];

int n;

//按行输入det
void inputDet()
{
    cout << "请输入行列式的阶数:" << endl;
    cin >> n;
    cout << "请按行输入一个行列式:" << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> det[i][j];
        }
    }
}

//打印det
void disDet()
{
    
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << det[i][j] << "\t";
        }
        cout << endl;
    }
}

//运算det
void solve()
{
    inputDet();

    double temp;

    int flag = 1;
    for (int j = 0; j < n; j++)
    {
        for (int i = j + 1; i < n; i++)
        {
            //处理首行首列的0行
            if (det[0][0] == 0)
            {
                //当前行,所有列,找到第一个非0的元素就交换
                for (int i = 0; i < n; i++)
                {
                    //当前行第一个非0元素,i为其所在行
                    if (det[i][0] != 0)
                    {
                        //交换两行
                        for (int j = 0; j < n; j++)
                        {
                            int temp = det[i][j];
                            det[i][j] = det[0][j];
                            det[0][j] = temp;
                        }
                        //每次交换之后符号变负
                        flag = -flag;
                        //防止多次交换
                        break;
                    }
                }
            }
            //分母不能为0
            else
            {
                //从当前列自顶向下变0
                temp = -det[i][j] / det[j][j];

                for (int k = 0; k < n; k++)
                {
                    det[i][k] += temp * det[j][k];
                }
            }
        }
    }

    //主对角相乘再乘以一个符号
    double result = 1;
    for (int i = 0; i < n; i++)
    {
        result *= det[i][i] * flag;
    }
    
    disDet();

    cout << " = " << result << endl;
}

int main(void)
{
    solve();

    return 0;
}

标签:cout,temp,求解,一个,det,++,int,行列式
From: https://www.cnblogs.com/codels/p/18226800

相关文章

  • 【教学类-58-09】黑白三角拼图07(1页3张黑白的白点卡片,一种宫格36张,适合一个班级一次操
    背景需求之前做了传统三角拼图,但是感觉幼儿遇到一些平行四边形时,都不知道要连接那几个点。【教学类-58-03】黑白三角拼图03(4*4宫格)总数算不出+随机抽取10张-CSDN博客文章浏览阅读864次,点赞27次,收藏16次。【教学类-58-03】黑白三角拼图03(4*4宫格)总数算不出+随机抽取10张htt......
  • 【教学类-58-06】黑白三角拼图06(1页3张彩色黑点卡片,一种宫格36张,适合一个班级一次操作
    作品展示背景需求【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)-CSDN博客文章浏览阅读343次,点赞10次,收藏6次。【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)https://blog.csdn.net/reasons......
  • 分享一个类似轮播图的账号切换效果
    看成品首先完成一个轮播图<style>*{box-sizing:border-box;}.box{display:flex;height:400px;overflow:auto;scroll-snap-type:xmandatory;/*横向滚动到一定程度,自动吸附反向上的下一个元素*/align-it......
  • Python 潮流周刊#53:我辈楷模,一个约见诺奖得主,一个成为核心开发者
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。本期周刊分享了12篇文章,12个开源项目,赠书5本《程序是怎样跑起来的(第3版)......
  • 一个简单的OCR识别引擎,但是很强大,支持80+的语言,Star 22.3K+!(本文附带一个简单的开发教
    OCR(OpticalCharacterRecognition,光学字符识别)已经融入到我们日常生活和工作中,有可能你没感觉到,但是你一定用到过,比如常见的一些场景:文档数据存储:例如,将纸质书籍、报纸、杂志或其他文件转换为可编辑的文本格式,便于存储和搜索;自动数据录入:比如在报销发票、整理收据时。利......
  • 初步搭建一个自己的对象存储服务---Minio
    docker安装1、拉取镜像dockerpullminio/minio2、启动镜像dockerrun-p9000:9000-p9001:9001--nameminio-d--restart=always-e"MINIO_ACCESS_KEY=admin"-e"MINIO_SECRET_KEY=admin123456"-v/home/data:/data-v/home/config:/root/.miniominio/m......
  • 使用select实现一个基于UDP的一对一即时聊天程序。
    注意事项UDP通信时,client要先给server发送消息,这样server才能知道client的信息代码//server#include<func.h>#defineBUFFSIZE1024intmain(){intsfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket");}structsockad......
  • AI | LLaMA-Factory 一个好用的微调工具
    ‘’LLamaFactory,这个工具能够高效且低成本地支持对100多个模型进行微调。LLamaFactory简化了模型微调的过程,并且易于访问,使用体验友好。此外,它还提供了由Hiyouga提供的HuggingFace空间,可用于对模型进行微调。下载LLaMA-Factory​#下载LLaMA-Factorygitclone......
  • 写一个 vscode 插件
    HxTranslate这是一个vscode扩展插件示例,参考:YourFirstExtension,可将helloworld更改为自己的扩展插件名称如:HxTranslate,其余默认即可.建议使用文心一言解答疑问.注意事项deepin终端运行:sudoaptinstallnodejs终端运行:npmi-gyogenerator-codety......
  • 超详细Python教程——第一个python程序
    一、Python简介Python是著名的“龟叔”GuidovanRossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。牛人就是牛人,为了打发无聊时间竟然写了一个这么牛皮的编程语言。现在,全世界差不多有600多种编程语言,但流行的编程语言也就那么20来种。不知道......