Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -974,6 +974,7 @@
* [Largest Square Area In Matrix](matrix/largest_square_area_in_matrix.py)
* [Matrix Based Game](matrix/matrix_based_game.py)
* [Matrix Class](matrix/matrix_class.py)
* [Matrix Diagonal Sum](matrix/matrix_diagonal_sum.py)
* [Matrix Equalization](matrix/matrix_equalization.py)
* [Matrix Multiplication Recursion](matrix/matrix_multiplication_recursion.py)
* [Matrix Operation](matrix/matrix_operation.py)
Expand Down
66 changes: 66 additions & 0 deletions matrix/matrix_diagonal_sum.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
"""
Matrix Multiplication Algorithm

This function performs matrix multiplication on two valid matrices.
It follows the mathematical definition:
If A is an m×n matrix and B is an n×p matrix,
then their product C is an m×p matrix.

Raises:
ValueError: if matrices have invalid structure or incompatible sizes.

Sources:
https://en.wikipedia.org/wiki/Matrix_multiplication

Examples:
>>> A = [[1, 2], [3, 4]]
>>> B = [[5, 6], [7, 8]]
>>> matrix_multiply(A, B)
[[19, 22], [43, 50]]

>>> matrix_multiply([[1, 2, 3]], [[4], [5], [6]])
[[32]]

# Invalid structure
>>> matrix_multiply([[1, 2], [3]], [[1, 2]])
Traceback (most recent call last):
...
ValueError: Invalid matrix structure

# Incompatible sizes
>>> matrix_multiply([[1, 2]], [[1, 2]])
Traceback (most recent call last):
...
ValueError: Incompatible matrix sizes
"""

from typing import List


def matrix_multiply(A: List[List[float]], B: List[List[float]]) -> List[List[float]]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide descriptive name for the parameter: A

Please provide descriptive name for the parameter: B

if not _is_valid_matrix(A) or not _is_valid_matrix(B):
raise ValueError("Invalid matrix structure")

rows_A = len(A)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Variable and function names should follow the snake_case naming convention. Please update the following name accordingly: rows_A

cols_A = len(A[0])

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Variable and function names should follow the snake_case naming convention. Please update the following name accordingly: cols_A

rows_B = len(B)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Variable and function names should follow the snake_case naming convention. Please update the following name accordingly: rows_B

cols_B = len(B[0])

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Variable and function names should follow the snake_case naming convention. Please update the following name accordingly: cols_B


if cols_A != rows_B:
raise ValueError("Incompatible matrix sizes")

result = [[0.0 for _ in range(cols_B)] for _ in range(rows_A)]

for i in range(rows_A):
for j in range(cols_B):
for k in range(cols_A):
result[i][j] += A[i][k] * B[k][j]

return result


def _is_valid_matrix(M: List[List[float]]) -> bool:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please provide descriptive name for the parameter: M

if not isinstance(M, list) or not M:
return False
first_length = len(M[0])
return all(isinstance(row, list) and len(row) == first_length for row in M)