矩阵行列式算法 C++

2024-06-29

我是编程新手,我一直在寻找一种找到矩阵行列式的方法。我在网上找到了这段代码,但我很难理解这里的算法。我对递归的基础没有问题,但继续和主循环我很难理解。非常感谢任何可以向我解释该算法的人。

int determ(int a[MAX][MAX],int n) {
  int det=0, p, h, k, i, j, temp[MAX][MAX];
  if(n==1) {
    return a[0][0];
  } else if(n==2) {
    det=(a[0][0]*a[1][1]-a[0][1]*a[1][0]);
    return det;
  } else {
    for(p=0;p<n;p++) {
      h = 0;
      k = 0;
      for(i=1;i<n;i++) {
        for( j=0;j<n;j++) {
          if(j==p) {
            continue;
          }
          temp[h][k] = a[i][j];
          k++;
          if(k==n-1) {
            h++;
            k = 0;
          }
        }
      }
      det=det+a[0][p]*pow(-1,p)*determ(temp,n-1);
    }
    return det;
  }
}

该算法使用分而治之的方法来解决问题(找到 N*N 矩阵的行列式)。

该算法使用递归模式,这是分而治之的方法之一。您可以通过注意算法在第三个条件语句中调用自身来发现这一点。

每个递归算法都有一个退出条件,它是代码中的第一个 if 语句。它们还包含一个部分,它是最方便问题的解决方案,或者是主要大问题的原子问题,而这些问题一开始就很难解决。原子问题或最分割的问题可以很容易地解决,因为您可以看到代码的第二个 if 语句。在你的例子中,它实际上是在求解 2*2 矩阵的行列式。

代码中最重要的部分是进行除法的部分(这也是递归的!),这也有点具有挑战性。 这部分是征服其中任何一个的关键。通过做一些回溯和数值示例,您可以找到答案:

det = det + a[0][p] * pow(-1,p) * determ(temp,n-1);

对于最后的建议,尝试使用仅需要一次除法的 3*3 矩阵。 祝你好运。

这本书非常适合开始学习和理解算法 http://mitpress.mit.edu/books/introduction-algorithms

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

矩阵行列式算法 C++ 的相关文章

  • 提高mmap memcpy文件读取性能

    我有一个从文件中顺序读取数据的应用程序 有些是直接从指向的指针读取mmaped 文件和其他部分是memcpyed 从文件到另一个缓冲区 我注意到在进行大型操作时性能不佳memcpy我需要的所有内存 1MB 块 以及在执行大量较小操作时的更好
  • C# 在 WebBrowser 中调用 JavaScript

    我正在尝试调用 JavaScript 方法WebBrowser WebBrowser webBrowser new WebBrowser webBrowser NavigateToString html webBrowser LoadCom
  • 将 ManualResetEvent 包装为可等待任务

    我想等待手动重置事件 并超时并观察取消 我想出了类似下面的东西 手动重置事件对象由我无法控制的 API 提供 有没有办法在不占用和阻塞 ThreadPool 线程的情况下实现这一点 static Task
  • 有关堆栈大小的警告消息

    I use Visual Studio 2010 with Code Analysis活性 在我的代码中 有一行在函数中分配一些内存 TCHAR someString 40000 代码分析抛出警告信息 警告 C6262 函数使用 40000
  • 以编程方式解析和编辑 C++ 源文件

    我想以编程方式解析和编辑 C 源文件 我需要更改 添加代码的某些部分 即函数 类块等 中的代码 我也 最好 能够得到评论 我想做的部分事情可以用下面的代码来解释 CPlusPlusSourceParser cp new CPlusPlusS
  • 为什么我们不能将新字符串分配给 char 数组,而是分配给指针?

    我试图将字符串重新分配给预初始化的数组 a 但我得到的只是一个错误 main char a Sunstroke char b Coldwave a Coldwave b Sunstroke printf n s s a b 错误 从类型 c
  • 字符集中字符的顺序

    是否通过标准保证字符的顺序 例如 我可以算出字符集表中 1 符号后面跟着 2 符号吗 或者它是特定于平台的 1999 年的 C 标准对字符集是这样规定的 基本源字符集和基本执行字符集都应具有以下成员 拉丁字母表中的 26 个大写字母 拉丁字
  • 执行 Mongo 查询 db.collection.runCommand("text",{"search":"search text"})

    我需要在我的网站中添加全文搜索选项 在 mongodb 中添加数据库 蒙戈查询 db collection runCommand text search search text 给出了结果 但是如何使用C 执行它 collection In
  • 可以取消链接以读写方式打开的文件

    在我的程序 在 Mac OS X 上 中 我使用以下代码打开该文件 int fd fd open filename O RDWR 删除文件的程序如下 unlink filename 就我而言 我有相同的文件被打开和删除 我观察到以下情况 打
  • 可变参数模板中的可变参数模板推导

    我不确定标题是否有意义 但这个例子实际上非常简单 A converter struct with a generic constructor template
  • 在带有传送器的网格上 A* 可接受的启发法?

    假设您有一个二维单元格网格 其中一些单元格被墙填充 角色可以从一个方格迈出一步 到达距离该方格水平或垂直一步的任何方格 但不能越过墙壁 给定起始位置和结束位置 我们可以使用具有可接受启发式的 A 算法找到从起始位置到结束位置的最短路径 在当
  • C# CsvHelper.ValidationException - 为什么?

    我正在尝试在 C 控制台应用程序中使用 CSVHelper 我有一个例外 CsvHelper ValidationException 标头匹配 Numer Dokumentu 未找到索引 0 处的名称 我不知道为什么 因为这个标题位于 cs
  • SQL:使用 1 个查询更新一行并返回列值

    我需要更新表中的一行 并从中获取列值 我可以这样做 UPDATE Items SET Clicks Clicks 1 WHERE Id Id SELECT Name FROM Items WHERE Id Id 这会生成 2 个对该表的计划
  • 为什么函数不能跟在 Main 之后

    为什么我不能在 main 之后放置一个函数 Visual Studio 无法构建程序 这是 C 怪癖还是 Visual Studio 怪癖 eg int main myFunction myFunction 会产生 main 无法使用 my
  • 将 double 转换为 float 后值不正确

    我有一些由 gcc gcc GCC 4 4 4 20100726 Red Hat 4 4 4 13 编译的执行高精度算术的 C 代码 计算的最终结果是一个 double 值 其值为 622 07999995861189 我是将双精度型转换为
  • 如何在Azure函数应用程序中调用函数后动态更改内容

    我正在使用 Visual Studio 2019 使用 Azure function v3 0 开发 Azure function 应用程序 我实现了一个时间触发的功能 我想更改内容 时间表 function json function j
  • 为什么将静态类内初始化成员传递给采用 const 引用的函数需要该成员有定义?

    这是基于最初提出的问题here https stackoverflow com questions 14547370 confusion about in class initialization of static data member
  • 使用 解释 gprof 输出

    我试图在我的程序中找到性能问题 从而通过分析来检测代码 gprof 创建一个如下所示的平面配置文件 Flat profile Each sample counts as 0 01 seconds cumulative self self t
  • ListView 内的 TextBox 绑定到对象,双向绑定不起作用

    Edit 好吧 在尝试了无数次但没有成功之后 我创建了一个非常小的 Wpf 应用程序 您可以直接复制此代码 请注意 当您更改文本框中的值并按 测试 按钮时 这些值永远不会更新 我不明白为什么双向绑定不起作用 请帮忙 这是 xaml
  • 画笔和钢笔使用指南

    制作 GDI 画笔和钢笔有多贵 我应该在添加所需的基础上创建它们并将它们包装在 using 中以便快速处理它们 还是应该创建一个类似于 System Drawing Brushes 类的静态类 IMO 它们足够高效 您通常不应该创建在多个方

随机推荐