C++ 程序计算矩阵的行列式

2024年8月28日 | 阅读 8 分钟

在本文中,我们将使用不同的方法来计算矩阵的行列式。在求行列式的值之前,我们必须了解矩阵行列式。矩阵的行列式是一个特定的整数,只适用于方阵(行数和列数相同的矩阵)。行列式在微积分和其他代数矩阵中经常使用;它描述了矩阵在一个实数上下文中的情况,该实数可用于求解线性方程组并识别矩阵的逆矩阵。

如何计算?

矩阵的行列式可以这样确定:对于第一行或第一列的每个元素,获取这些分量的代数余子式,将分量与其相关代数余子式的行列式相乘,然后以相反的符号将它们相加。在最基本的情况下,1*1 矩阵的行列式就是单个值本身。元素的代数余子式是通过从该矩阵中删除元素的列和行而获得的矩阵。

方法 1

文件名:Determinant.cpp

让我们举一个例子来说明 C++ 中矩阵的行列式

输出

The determinant of the matrix is: 10

时间复杂度:O(N!)

说明

getCofactorMatrix() 函数的时间复杂度为 O(N^2)。可以使用以下递归关系来计算 determinantOfMatrix() 方法的时间复杂度:

T(N) =N*T(N-1) + O(N^3)

第一个数字 N*T(N-1) 表示计算 (N-1) x (N-1) 子矩阵的行列式所需的时间。相比之下,第二个值 O(N-3) 表示计算原始矩阵第一行中每个分量所需的代数余子式所需的时间。我们可以将确定 NxN 矩阵的因子计算为其行列式的总和 (N-1)x(N-1) 矩阵,其中每个矩阵都需要 O(N^2) 操作来获取代数余子式,使用按位扩展。因此,determinantOfMatrix() 方法的时间复杂度为 O(N!),这是矩阵是重组矩阵时最极端的情况。

display() 函数的时间复杂度为 O(N^2),因为它遍历所有矩阵成员以打印它们。它的计算复杂度为 O(N!),因为 determinantOfMatrix() 函数支配了程序代码的整个时间复杂度。

空间复杂度:O(N*N)

通过应用行列式性质,我们遍历每个对角线元素,使对角线下方所有元素都变为零。

方法 2

如果此对角线元素为零,我们将查找同一列中的下一个非零元素。

有两种可能性。

情况 1:如果没有非零元素。在这种情况下,矩阵的行列式值为 0。

情况 2:如果存在非零元素,有两种可能性。

  • 情况 a:如果索引与对角线行成员匹配,我们使用行列式性质将所有列项归零。
  • 情况 b:在这里,我们必须交换行与相应的对角线元素列,并继续执行情况 'a' 的过程。

示例

文件名:Determinanat2.cpp

输出

The Determinant of the given matrix is: 31

复杂度

时间复杂度:O(N3)

空间复杂度: O(N)

方法 3:高斯-约旦消元法

步骤:

  1. 从给定矩阵开始,并将行列式设置为 1
  2. 在跟踪行列式的同时,使用简单的行操作将矩阵转换为其行阶梯形。
  3. 如果有任何行交换操作,则将行列式的值乘以 -1
  4. 如果任何行包含导致零值的系数,则行列式为零,我们可以在此处停止。
  5. 行列式是行阶梯形中对角线元素的乘积。
  6. 返回行列式的值。

示例

文件名:DeterminantByGauss.cpp

输出

The Determinant value is= 85

复杂度

时间复杂度:O(N3),其中 n 是矩阵中的总行数(或列数)。

辅助空间:O(1),因为矩阵已就地修改。

方法 4:余子式展开

步骤:

  1. 创建一个函数,使用余子式展开计算矩阵的行列式值。
  2. 如果正在计算的矩阵不是方阵,则返回错误语句。
  3. 如果矩阵为 1×1,则返回一个元素。
  4. 如果元素组合为 2×2,则使用 ad-bc 公式返回行列式的值。
  5. 如果元素数量大于 2×2,则遍历第一行并计算每个分量的余子式。
  6. 将每个余子式乘以其关联元素,并带上元素的符号 (+/-)
  7. 将步骤 6 的结果相加即可获得行列式。

示例

文件名:Cofactor.cpp

输出

The Determinant is: 24

复杂度

时间复杂度:O(N!)

空间复杂度:O(N^2)