Package: matrixObj
matrixObjA simple matrix module for basic mathematical matrix operations. Create and make use ofMatrix objectsin your python codes, perform operations like
Matrix Addition, Subtration, Multiplication and Scalar Division and other operations like (transpose, co-factor, inverse, minor, determinant, adjoint and elementary operation).InstallationpipinstallmatrixObjProject DemofrommatrixObjimportMatrixYou can create a new Matrix instance with any of thepython number objects(int, float, complex and Fraction) eg.matA=Matrix([5,3,-1],[3,5,9],[0,5,2])matB=Matrix([3.0,4.5],[2.6,5.2])cmplxMat=Matrix([1+2j,2+1j],[4-4j,1-2j],[3+0j,1j])print(matA,end="   ")print(matA.dimension()+" Matrix")# dimension() returns the string depicting the matrix's shape.print(matB,end="   ")print(matB.dimension()+" Matrix")print(cmplxMat,end="   ")print(cmplxMat.dimension()+" Matrix")Output:|5     3    -1||3     5     9||0     5     2|3x3 Matrix|3.0    4.5||2.6    5.2|2x2 Matrix|(1+2j)(2+1j)||(4-4j)(1-2j)||(3+0j)1j|3x2 Matrixwith Fraction object, you will have to import it from the fractions modulefromfractionsimportFractionfracMat=Matrix([Fraction(1,3),Fraction(2,5)],[Fraction(1,2),Fraction(3,27)])print(fracMat)output:|1/3    2/5||1/2    1/9|Matrix Arithmetic OperationsA=Matrix([1,-3,3],[4,0,2])B=Matrix([4,6,0],[3,0,5])C=Matrix([3,-2],[0,4],[-1,5])D=Matrix([1,-3,3],[4,0,2])E=Matrix([3,1,0],[9,-1,2],[0,1,3])# Addition and SubtractionsumAB=A+B# Sum of matricesdifAB=A-B# Difference of matrices# ProductproductAC=A*C# Product of matrices# Scalar Divisiona=A/2# Same operation as (A * 0.5)print(sumAB,"--> A + B")print(difAB,"--> A - B")print(productAC,"--> A * C")print(a,"--> A\u00F72")# Unicode of Division Symbol (\u00F7)print("\nA == D:",A==D)# Matrix EqualityOutput:|5    3    3||7    0    7|-->A + B|-3    -9     3||1     0    -3|-->A - B|0     1||10     2|-->A * C|0.5    -1.5     1.5||2.0     0.0     1.0|-->A ÷ 2

A == D: TrueSquare Matrix OperationsmatrixA=Matrix([4,8,2],[0,5,2],[4,8,1])print(matrixA.determinant())# The determinant of the matrixprint(matrixA.minor())# The minor of the matrixprint(matrixA.cofactor())# The Cofactor of the matrixprint(matrixA.inverse())# Inverse of the matrixOutput:

-20|-11     -8    -20||-8     -4      0||6      8     20||-11      8    -20||8     -4      0||6     -8     20||0.55    -0.4    -0.3||-0.4     0.2     0.4||1.0    -0.0    -1.0|To return the inverse of the matrix in fraction, set the argumentinfraction=Trueprint(matrixA.inverse(infraction=True))Output:|11/20     -2/5    -3/10||-2/5      1/5      2/5||1        0       -1|To get minor and co-factor at a particular ith, jth position of the matrix, use the methodsminor_at_ij()andcofactor_at_ij()(i and j positions are indexed from 1 instead of 0) eg.print(matrixA.minor_at_ij(1,1))# Minor at row 1 column 1print(matrixA.cofactor_at_ij(3,1))# Cofactor at row 3 column 1Output:

-11
6More Square matrix arithmetic operationsA=Matrix([4,8,2],[0,5,2],[4,8,1])B=Matrix([3,7,0],[2,9,7],[-1,-3,0])# Power of a Square Matrixprint(A**3)# A³  = A * A * Aprint(A**-1)# A⁻¹ = A.inverse(infraction=True)print(A**-2)# A⁻² = A.inverse(infraction=True) ** 2# Division of Squareprint(2/A)# 2 * A.inverse(infraction)print(A/B)# A * Bprint(A/A)# Identity MatrixOutput:|200    840    250||80    365    110||180    760    225||11/20     -2/5    -3/10||-2/5      1/5      2/5||1        0       -1||13/80    -3/10    -1/40||1/10      1/5     -1/5||-9/20     -2/5     7/10||11/10     -4/5     -3/5||-4/5      2/5      4/5||2        0       -2||17/7       2/7      27/7||-29/14       2/7    -79/14||31/14       1/7     41/14||1    0    0||0    1    0||0    0    1|Elementary Operationsmat=Matrix([3,0,1],[0,2,3],[5,-3,-1])# Elementary Row operationprint(mat.elementary_operation(2,3))# Interchange row 2 and 3print(mat.elementary_operation(1,scalar=2))# Multiply row 1 by 2print(mat.elementary_operation(1,3,scalar=2))# Multiply row 3 by 2, add the result to row 1Output:|3      0       1||5     -3      -1||0      2       3||6      0       2||0      2       3||5     -3      -1||13     -6      -1||0      2       3||5     -3      -1|For Elementary column Operation set argument row=False eg.# Elementary Column operationprint(mat.elementary_operation(2,3,row=False))# Interchanges column 2 and 3Output:|3      1       0||0      3       2||5     -1      -3|Row Reducing to Echelon FormTo row reduce matrix to echelon form by means of elementary operations, call the methodrref()on the matrix eg.# Reducing Matrix to echelon forma=Matrix([1,0,-2],[2,-1,3],[4,1,8])reduced_a=a.rref()print("Matrix a")print(a)print("\nReduced matrix a")print(reduced_a)b=Matrix([0,1,3],[4,2,-8],(2,3,2))reduced_b=b.rref()print("\n\nMatrix b")print(b)print("\nReduced matrix b")print(reduced_b)print("\nThe Rank of matrix a is:",a.rank())print("The Rank of matrix b is:",b.rank())Output:

Matrix a|1     0    -2||2    -1     3||4     1     8|Reduced matrix a|1.0    0.0    0.0||0.0    1.0    0.0||0.0    0.0    1.0|Matrix b|0     1     3||4     2    -8||2     3     2|Reduced matrix b|1.0     0.0    -3.5||0       1       3||0.0     0.0     0.0|The Rank of matrix a is: 3
The Rank of matrix b is: 2By default, therref()method returns the reduced matrix in floating numbers, to perform the reduction operation in fraction set the argumentinfractiontoTrueprint(b.rref(infraction=True))Output:|1       0    -7/2||0       1       3||0       0       0|Reducing to Upper and Lower Triangular MatrixReduce square matrices to upper or lower triangular matrices. eg,>>>importmatrixObj>>>>>>matrix=matrixObj.random_matrix(-10,15,(3,3))>>># Generates a random matrix of size 3 (with random numbers between -10 and 15)>>>>>>matrixMatrix(|-5-711||9156||515-3|)>>>>>>matrix.reduce_to_utriangle()# Reduce to upper triangle matrixMatrix(|-5-711||012/5129/5||00-78|)>>>>>>matrix.reduce_to_ltriangle()# Reduce to lower triangle matrixMatrix(|-104/1500||19450||515-3|)>>>If matrix is not a square matrix and the row size is less than the column size, reducing to triangular matrix returns an AugMatrix (the extra columns are augmented), otherwise (i.e rowsize > columnsize), raises ValueError>>>matrix=matrixObj.random_matrix(-8,8,(3,4))>>>matrixMatrix(|3648||8426||3502|)>>>>>>matrix.reduce_to_ltriangle()AMatrix(|-59/200|-8||13/210|2||364|8|)>>>Modifying the MatrixAfter initialization of a Matrix object, you can change, insert new and expand the rows/columns in the matrix eg.mat=Matrix([1,0,2],[3,1,0])mat.setrow(1,[5,-3,2])# Changes row 1 to [5, -3, 2]mat.insertrow(2,[3,-3,1])# Inserts [3, -3, 1] in the second rowmat.expandrow([2,5,5])# Appends row [2, 5, 5] to the matrixmat.expandcolumn([4,5,-4,0])# Appends column [4, 5, -4, 0]print(mat)# With all the modifications we should now have a 4x4 matrixOutput:|5     -3       2       4||3     -3       1       5||3      1       0      -4||2      5       5       0|Modifying by SlicingGet, set or delete part/slice of the matrix. eg.# Getting part/slice of the matrixmatA=Matrix([2,5,-4],[4,5,9],[-1,-8,0],[7,0,5])print(matA[1,0])# Gets first element in the second rowprint(matA[2])# Gets the third row of the matrixprint(matA[:,-1])# Gets the last column of the matrixprint(matA[0:3])# Gets the first, the second and the third rowprint(matA[::-1,::-1])# Gets the reverse of the matrix rows with each row also reversedOutput:
4|-1    -8     0||-4     9     0     5||2     5    -4||4     5     9||-1    -8     0||5     0     7||0    -8    -1||9     5     4||-4     5     2|# Setting part/slice of the matrixmatA[1]=[-20,40,10]# sets the second rowprint(matA)matA[:,0]=[1,2,3,4]# sets the first columnprint(matA)Output:|2      5     -4||-20     40     10||-1     -8      0||7      0      5||1      5     -4||2     40     10||3     -8      0||4      0      5|All elements in a slice can be set to the same scalar value eg.matA[-1]=4# Sets all the elements in the last row to 4print(matA)fromfractionsimportFractionmatA[:]=Fraction(1,3)# Sets all elements in the matrix to 1/3print(matA)Output:|2     5    -4||4     5     9||-1    -8     0||4     4     4||1/3    1/3    1/3||1/3    1/3    1/3||1/3    1/3    1/3||1/3    1/3    1/3|Using thedel()function to delete some part of the matrix, this can only delete complete row(s) or column(s)...matA=Matrix([2,5,-4],[4,5,9],[-1,-8,0],[7,0,5])del(matA[1])# Deletes the second rowprint(matA)Output:|2     5    -4||-1    -8     0||7     0     5|del(matA[:,0])# Deletes the first columnprint(matA)Output:|5    -4||5     9||-8     0||0     5|del(matA[1:-1])# Deletes the second row up to the last rowprint(matA)Output:|2     5    -4||7     0     5|frommatrixObjimportrandom_matrixmatB=random_matrix(-10,10,(4,6))print(matB)del(matB[:,-1:0:-2])# Deletes columns 6, 4, and 2print(matB)Output:|-10      0     -5     -9      7     -3||4     -8     -4     -7      9      3||-1      9      8     -7      2     -5||2      4      5     -1     -6     -1||-10     -5      7||4     -4      9||-1      8      2||2      5     -6|NOTE: Using the methods (insertrow(),insertcolumn(),expandrow(),removerow()etc.) to modify matrix take indexes from 1 instead of slicing which takes indexes from 0String RepresentationThe String Representation of the Matrix object (as can be seen from the examples above). All elements (four H_whitespaced from each other and rightly justified) in each row of the matrix are arranged in between two pipe charater "|" but guess what? You can change the representation to any other desired representation withsetrepr()method. eg. If you prefer to have your matrix represented as python list, consider the example below:# Declear a function that takes exactly one argument and returns a str# This argument will be the tuple of the matrix rows# which will be supplied by the matrix class when invoking the functiondefnewrepr(matrix):returnstr(list(matrix))Matrix.setrepr(newrepr)mat=Matrix([4,5,-1],[0,1,3],[5,2,7])print(mat)Output:
[[4, 5, -1], [0, 1, 3], [5, 2, 7]]You can do str manipulation on the matrix parameter in the body of your defined function and simply return the desired str representantion for your matrix objects. To change back to the defaul representation, useresetrepr()Augmented MatrixA subclass of the Matrix class. Append the columns of two matrix to form an augmented matrix and perform the same elementary operations on both matrices augmented together.
The constructor takes two arguments (matrix A and matrix B) which can be matrix objects or a list of matrix rows of both matrices>>>frommatrixObjimportAugMatrix>>>>>>>>>matA=Matrix([3,5,9],[1,-2,0],[2,3,1])>>>b=[4,-5,7]>>>augmentAB=AugMatrix(matA,augcolumn=b)>>>augmentABAMatrix(|359|4||1-20|-5||231|7|)>>># Augmented Matrix from two matrices>>>matA=Matrix([5,7,0],[1,-1,2],[3,0,1])>>>matB=Matrix([1,0,9],[4,2,1],[2,1,0])>>>>>>augAB=AugMatrix(matA,matB)>>>augABAMatrix(|570|109||1-12|421||301|210|)>>># If a second matrix is not supplied, the first matrix is augmented with it's last column as the augmented part>>>c=Matrix([-2,3,1,5],[3,0,9,2],[1,2,9,0])>>>augC=AugMatrix(c)>>>augCAMatrix(|-231|5||309|2||129|0|)>>>#If a second integer argument is suppied, the first matrix is augmented by indexing from the integer argument>>>d=Matrix([4,5,0,1,-1],[-2,2,1,3,-1],[3,7,0,-5,2])>>>augD=AugMatrix(d,3)AMatrix(|450|1-1||-221|3-1||370|-52|)>>>Solving System of linear EquationSuppose there's a system of linear equations which may be consistent with unique solution or many solutions or inconsistent with no solution. e.g.Consistent Equations with Unique Solution
        1                       2
2x + y  -  z = 1         a + 2b +  c = 2
   + 2y +  z = 2        3a +  b - 2c = 1
5x + 2y - 3z = 3        4a - 3b -  c = 3#                       1# 2x + y  -  z = 1#    + 2y +  z = 2# 5x + 2y - 3z = 3# to matrixcoeficients=Matrix([2,1,-1],[0,2,1],[5,2,-3])constants=Matrix([1],[2],[3])augEquation=AugMatrix(coeficients,constants)reducedEquation=augEquation.rref(infraction=True)solution=reducedEquation.augcolumnprint(augEquation)print(reducedEquation)print(solution)print(f"\nx ={solution[0,0]}")print(f"y ={solution[1,0]}")print(f"z ={solution[2,0]}")Output:|2     1    -1|1||0     2     1|2||5     2    -3|3||1     0     0|-3||0     1     0|3||0     0     1|-4||-3||3||-4|x = -3
y = 3
z = -4#                       2#  a + 2b +  c = 2# 3a +  b - 2c = 1# 4a - 3b -  c = 3coeficients=Matrix([1,2,1],[3,1,-2],[4,-3,-1])constants=Matrix([2],[1],[3])equations=AugMatrix(coeficients,constants)reducedEquation=equations.rref(infraction=True)solution=reducedEquation.augcolumnprint(equations)print(solution)print(f"\na ={solution[0,0]}, b ={solution[1,0]}, c ={solution[2,0]}")Output:|1     2     1|2||3     1    -2|1||4    -3    -1|3||1||0||1|a = 1, b = 0, c = 1This type of equation can also be solved algebraically or using Cramer's Rule2
  a + 2b +  c = 2
 3a +  b - 2c = 1
 4a - 3b -  c = 3

In Matrix

[1    2    1]           [a]             [2]
[3    1   -2]     x     [b]     =       [1]
[4   -1   -1]           [c]             [3]

      A           x      B      =        C

Algebraically:

A x B = C   -->   B = C / A     -->    B = A⁻¹ x C

Using Cramer's Rule (Bᵢ = |Aᵢ| ÷ |A|)

a = |A₁| ÷ |A|
b = |A₂| ÷ |A|
c = |A₃| ÷ |A|# AlgebraicallyA=Matrix([1,2,1],[3,1,-2],[4,-1,-1])C=Matrix([2],[1],[3])B=(A**-1)*Cprint(B)print(f"\nB ={[int(i)foriinB.getcolumn(1)]}")# By Cramer's Ruleprint("\nUsing Cramer's Rule")det=A.determinant()# Determinant of Matrix A# Value of aAcopy=A.copy()# Making a copy of Matrix AAcopy[:,0]=C# Modifying Matrix, seting column 1 of A to Ca=Acopy.determinant()/detprint(f"a ={a}")# Value of bAcopy=A.copy()Acopy[:,1]=C# Modifying Matrix, seting column 2 of A to Cb=Acopy.determinant()/detprint(f"b ={b}")# Value of cAcopy=A.copy()Acopy[:,2]=C# Modifying Matrix, seting column 3 of A to Cc=Acopy.determinant()/detprint(f"c ={c}")Output:|1||0||1|B = [1, 0, 1]

Using Cramer's Rule
a = 1.0
b = -0.0
c = 1.0Other Methods of the Matrix classtranpose(): returns the transpose of matrixnonzeros(): returns the number non-zero rows/columns in matrixsum(): returns the sum of all elements in matrixidentity(): generates identity matrixzero_matrix(): generates a zero matrixones_matrix(): generates a ones matrixrandom_matrix(): generates a matrix with random numberstrace(): returns the sum of the diagonal elementsBoolean Methodsissquare()symmetric()skew()invertible()isorthogonal()isnormal()isrowmatrix()iscolumnmatrix()issingletonmatrix()isnull()