Skip to content
Open
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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
__pycache__/
*.pyc
4 changes: 4 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"python-envs.defaultEnvManager": "ms-python.python:conda",
"python-envs.defaultPackageManager": "ms-python.python:conda"
}
Binary file removed __pycache__/fraction.cpython-312.pyc
Binary file not shown.
Binary file removed __pycache__/test_fraction.cpython-312.pyc
Binary file not shown.
113 changes: 113 additions & 0 deletions matrix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import ast

class Matrix:

def parse_matrix(self, mat_str):
try:
mat = ast.literal_eval(mat_str)

if not isinstance(mat, list) or not mat:
raise ValueError("Invalid matrix")

row_len = len(mat[0])
for row in mat:
if not isinstance(row, list) or len(row) != row_len:
raise ValueError("Irregular matrix")

return mat

except:
raise ValueError("Invalid matrix format")


def matrix_add(self, A, B):
A = self.parse_matrix(A)
B = self.parse_matrix(B)

if not A or not B:
raise ValueError("Empty matrix")

rows = len(A)
cols = len(A[0])

if rows != len(B) or cols != len(B[0]):
raise ValueError("Matrix dimensions must match")

result = []
for i in range(rows):
row = []
for j in range(cols):
row.append(A[i][j] + B[i][j])
result.append(row)

return str(result)


def matrix_subtract(self, A, B):
A = self.parse_matrix(A)
B = self.parse_matrix(B)

if not A or not B:
raise ValueError("Empty matrix")

rows = len(A)
cols = len(A[0])

if rows != len(B) or cols != len(B[0]):
raise ValueError("Matrix dimensions must match")

result = []
for i in range(rows):
row = []
for j in range(cols):
row.append(A[i][j] - B[i][j])
result.append(row)

return str(result)


def matrix_multiply(self, A, B):
A = self.parse_matrix(A)
B = self.parse_matrix(B)

if not A or not B:
raise ValueError("Empty matrix")

rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])

if cols_A != rows_B:
raise ValueError("Invalid dimensions for multiplication")

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

return str(result)


def matrix_transpose(self, A):
A = self.parse_matrix(A)

if not A:
raise ValueError("Empty matrix")

rows = len(A)
cols = len(A[0])

result = []
for j in range(cols):
row = []
for i in range(rows):
row.append(A[i][j])
result.append(row)

return str(result)
85 changes: 85 additions & 0 deletions test_matrix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
def test_add():
from matrix import Matrix
m = Matrix()
assert m.matrix_add('[[1,2],[3,4]]', '[[5,6],[7,8]]') == '[[6, 8], [10, 12]]'

def test_multiply():
from matrix import Matrix
m = Matrix()
assert m.matrix_multiply('[[1,2],[3,4]]', '[[5,6],[7,8]]') == '[[19, 22], [43, 50]]'

def test_transpose():
from matrix import Matrix
m = Matrix()
assert m.matrix_transpose('[[1,2],[3,4]]') == '[[1, 3], [2, 4]]'

def test_subtract():
from matrix import Matrix
m = Matrix()
assert m.matrix_subtract('[[5,6],[7,8]]', '[[1,2],[3,4]]') == '[[4, 4], [4, 4]]'

def test_add_dimension_mismatch():
from matrix import Matrix
m = Matrix()
try:
m.matrix_add('[[1,2]]', '[[1,2],[3,4]]')
assert False
except ValueError:
assert True
def test_empty_matrix():
from matrix import Matrix
m = Matrix()
try:
m.matrix_add('[]', '[]')
assert False
except ValueError:
assert True

def test_invalid_format():
from matrix import Matrix
m = Matrix()
try:
m.matrix_add('abc', '[[1,2]]')
assert False
except ValueError:
assert True

def test_irregular_matrix():
from matrix import Matrix
m = Matrix()
try:
m.matrix_add('[[1,2],[3]]', '[[1,2],[3,4]]')
assert False
except ValueError:
assert True

def test_multiply_dimension_mismatch():
from matrix import Matrix
m = Matrix()
try:
m.matrix_multiply('[[1,2]]', '[[1,2]]')
assert False
except ValueError:
assert True

def test_single_element():
from matrix import Matrix
m = Matrix()
assert m.matrix_add('[[5]]', '[[3]]') == '[[8]]'

def test_negative_values():
from matrix import Matrix
m = Matrix()
assert m.matrix_add('[[-1,-2],[-3,-4]]', '[[1,2],[3,4]]') == '[[0, 0], [0, 0]]'

def test_transpose_rectangular():
from matrix import Matrix
m = Matrix()
assert m.matrix_transpose('[[1,2,3],[4,5,6]]') == '[[1, 4], [2, 5], [3, 6]]'

def test_large_matrix():
from matrix import Matrix
m = Matrix()
A = '[[1,1],[1,1]]'
B = '[[1,1],[1,1]]'
assert m.matrix_add(A, B) == '[[2, 2], [2, 2]]'