用于检查对合矩阵的 Python 程序
在本文中,我们将学习一个用于检查对合矩阵的 Python 程序。
假设我们已经获取了一个输入矩阵。现在,我们将使用以下方法检查输入矩阵是否为对合矩阵。
使用的方法
以下是完成此任务的各种方法 -
使用嵌套 For 循环
使用 NumPy 模块
什么是对合矩阵?
如果矩阵与自身相乘并给出单位矩阵,则称其为对合矩阵。其逆矩阵为对合矩阵。
如果A * A = I,则矩阵 A 称为对合矩阵。此处的 I 表示单位矩阵。
方法 1:使用嵌套 For 循环
算法(步骤)
以下是执行所需任务所要遵循的算法/步骤。 −
创建一个变量来存储矩阵的行数。
创建一个函数 multiplyMatrix(),通过接受输入矩阵来执行矩阵乘法
执行矩阵乘法。
使用 return 语句返回结果矩阵乘法输出。
创建一个函数 checkInvolutoryMat(),通过接受输入矩阵作为参数来检查输入矩阵是否为 involuntary 矩阵。
创建一个 rows*rows 大小的矩阵,所有元素均为 0,并将其存储为 outputMatrix。
调用上述 multiplyMatrix() 函数来执行矩阵乘法并将结果保存在上述 outputMatrix 变量中。
遍历 outputMatrix 的每个元素。
使用 if 条件语句检查对角线元素是否不为 1,如果为真则返回 False,即不是非自愿矩阵。
使用 if 条件语句检查非对角线元素是否不为 0,如果为真则返回 False,即不是非自愿矩阵。
创建一个变量来存储输入矩阵。
使用 if 条件语句通过将输入矩阵作为参数传递来检查上面定义的 checkInvolutoryMat() 函数是否返回 true。
如果条件为,则打印非自愿矩阵 true。
否则打印 NOT involuntary matrix
示例
以下程序使用嵌套 for 循环检查输入矩阵是否为非自愿矩阵 −
# 输入行数 rows = 3 # 创建执行矩阵乘法的函数 def multiplyMatrix(inputMatrix, output): # 遍历矩阵的行 for p in range(rows): # 遍历当前行的所有列 for q in range(rows): # 假设当前元素为 0 output[p][q] = 0 for x in range(rows): # 执行矩阵乘法 output[p][q] += inputMatrix[p][x] * inputMatrix[x][q] # 返回结果矩阵乘法输出 return output # 创建一个函数来检查输入矩阵 # 是否为非自愿矩阵,方法是接受矩阵作为参数 def checkInvolutoryMat(inputMatrix): # 创建一个所有元素均为 0 的行*行大小矩阵 output = [[0 for p in range(rows)] for q in range(rows)] # 调用上面的 multiplyMatrix() 函数 output = multiplyMatrix(inputMatrix, output) # 在输出矩阵的行中进行迭代 for p in range(rows): # 在输出矩阵的对角线上迭代 for q in range(rows): # 如果它是一个对角线元素并且不是 1,则返回 False(非自愿) if (p == q and output[p][q] != 1): return False # 如果它是一个非对角线元素并且不是 1,则返回 False(非自愿) if (p != q and output[p][q] != 0): return False # 这是一个非自愿矩阵,因此返回 True return True # 输入矩阵 inputMatrix = [[1, 0, 0], [0, -1, 0], [0, 0, -1]] # 检查上述 checkInvolutoryMat() 函数是否返回 true # 通过将输入矩阵作为参数传递 if (checkInvolutoryMat(inputMatrix)): # 如果条件为真,则打印非自愿矩阵 print("输入矩阵为对合矩阵") else: # 否则打印非对合矩阵 print("输入矩阵非对合矩阵")
输出
输入矩阵为对合矩阵
时间复杂度 − O(N^3)
辅助空间 − O(N^2)
方法 2:使用 NumPy 模块
利用 numpy 库是确定矩阵是否对合的另一种方法。这可以通过使用 numpy.allclose() 函数将矩阵与其逆进行比较来实现。
算法(步骤)
以下是执行所需任务所要遵循的算法/步骤。 −
使用 import 关键字导入 numpy 模块。
创建一个函数 checkInvolutoryMat(),通过接受输入矩阵作为参数来检查输入矩阵是否为 非自愿 矩阵。
使用 numpy.linalg.inv() 函数(计算矩阵的逆)来获取输入矩阵的逆。
使用 numpy.allclose() 函数通过将输入矩阵及其逆矩阵作为参数传递来检查输入矩阵是否等于其逆并返回结果。
如果两个数组在 公差 范围内元素相等,则 allclose() 函数将返回正确。
公差 值为正,且通常具有非常小的值。
示例
以下程序使用 numpy.linalg.inv()、numpy.allclose() 函数检查输入矩阵是否为非自愿矩阵 −
# 使用 numpy 模块 import numpy as np # 创建一个函数来检查输入矩阵 # 是否为非自愿矩阵,方法是接受矩阵作为参数 def checkInvolutoryMat(inputMatrix): # 使用 numpy linalg 模块获取输入矩阵的逆 inverseMat = np.linalg.inv(inputMatrix) # 检查输入矩阵是否等于其逆矩阵 # 使用 numpy.allclose() 函数并返回结果 return np.allclose(inputMatrix, inverseMat) # 输入矩阵 inputMatrix = [[1, 0, 0], [0, -1, 0], [0, 0, -1]] # 通过将输入矩阵作为参数传递来调用 checkInvolutoryMat() 函数 # 输出 True 表示 INVOLUNTARY 矩阵 print(checkInvolutoryMat(inputMatrix))
输出
True
在上面的例子中,输出 True 表示给定的输入矩阵是 Involuntary矩阵。
此方法利用了 numpy 优化的线性代数例程,具有更短、更易于理解的优点。此方法的时间复杂度取决于矩阵逆计算的复杂度,对于密集矩阵,通常为 O(N^3)。空间复杂度为 O(N^2)。
时间复杂度 - O(N^3)
空间复杂度 - O(N^2)
结论
在本文中,我们学习了如何使用两种不同的方法来确定给定矩阵是否为非自愿的。我们学习了如何利用 NumPy 模块的 linalg.inv() 函数来获取给定矩阵的逆。