""" A matrix is a two-dimensional collection of numbers. Math convention uses capital letter to represent matrices. 2 x 3 Matrix A = [[1, 2, 3], [4, 5, 6]] 3 x 2 Matrix B = [[1, 2], [3, 4], [5, 6]] """ from typing import List, Tuple, Callable def shape(A: List[List[float]]) -> Tuple[int, int]: """Calculates the shape of a matrix. If matrix has n rows and k columns we call it a n x k matrix.""" num_rows = len(A) num_columns = len(A[0]) if A else 0 return num_rows, num_columns def get_row(A: List[List[float]], i) -> List[float]: """Returns the ith row from a matrix.""" return A[i] def get_column(A: List[List[float]], j) -> List[float]: """Returns the jth column from a matrix.""" return [A_i[j] for A_i in A] def make_matrix( num_rows: int, num_colums: int, entry_fn: Callable ) -> List[List[float]]: """Creates a n x k matrix whose (i, j)th entry is entry(i, j).""" return [[entry_fn(i, j) for j in range(num_colums)] for i in range(num_rows)] def is_diagonal(i , j) -> int: """1's on the 'diagonal', 0's everywhere else.""" return 1 if i == j else 0