From a823a86a29689ff5550af7a337caf86c478854fe Mon Sep 17 00:00:00 2001 From: RobotGuy999 <68413067+RobotGuy999@users.noreply.github.com> Date: Thu, 23 Jul 2020 19:18:17 +0800 Subject: [PATCH] Added "Inverse of Matrix" Algorithm (#2209) * Added "Inverse of Matrix" Algorithm * Small quotation marks change * Update inverse_of_matrix.py * Updated doctests * Update inverse_of_matrix.py * Add type hints * swaped --> swapped Co-authored-by: Christian Clauss --- matrix/inverse_of_matrix.py | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 matrix/inverse_of_matrix.py diff --git a/matrix/inverse_of_matrix.py b/matrix/inverse_of_matrix.py new file mode 100644 index 000000000..abbeb79dd --- /dev/null +++ b/matrix/inverse_of_matrix.py @@ -0,0 +1,39 @@ +from decimal import Decimal +from typing import List + + +def inverse_of_matrix(matrix: List[List[float]]) -> List[List[float]]: + """ + A matrix multiplied with its inverse gives the identity matrix. + This function finds the inverse of a 2x2 matrix. + If the determinant of a matrix is 0, its inverse does not exist. + + Sources for fixing inaccurate float arithmetic: + https://stackoverflow.com/questions/6563058/how-do-i-use-accurate-float-arithmetic-in-python + https://docs.python.org/3/library/decimal.html + + >>> inverse_of_matrix([[2, 5], [2, 0]]) + [[0.0, 0.5], [0.2, -0.2]] + >>> inverse_of_matrix([[2.5, 5], [1, 2]]) + Traceback (most recent call last): + ... + ValueError: This matrix has no inverse. + >>> inverse_of_matrix([[12, -16], [-9, 0]]) + [[0.0, -0.1111111111111111], [-0.0625, -0.08333333333333333]] + >>> inverse_of_matrix([[12, 3], [16, 8]]) + [[0.16666666666666666, -0.0625], [-0.3333333333333333, 0.25]] + >>> inverse_of_matrix([[10, 5], [3, 2.5]]) + [[0.25, -0.5], [-0.3, 1.0]] + """ + + D = Decimal # An abbreviation to be conciseness + # Calculate the determinant of the matrix + determinant = D(matrix[0][0]) * D(matrix[1][1]) - D(matrix[1][0]) * D(matrix[0][1]) + if determinant == 0: + raise ValueError("This matrix has no inverse.") + # Creates a copy of the matrix with swapped positions of the elements + swapped_matrix = [[0.0, 0.0], [0.0, 0.0]] + swapped_matrix[0][0], swapped_matrix[1][1] = matrix[1][1], matrix[0][0] + swapped_matrix[1][0], swapped_matrix[0][1] = -matrix[1][0], -matrix[0][1] + # Calculate the inverse of the matrix + return [[float(D(n) / determinant) or 0.0 for n in row] for row in swapped_matrix]