```python
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import scipy as sp
import sympy as sy
sy.init_printing() 
```


```python
np.set_printoptions(precision=3)
np.set_printoptions(suppress=True)
```


```python
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all" # display multiple results
```


```python
def round_expr(expr, num_digits):
    return expr.xreplace({n : round(n, num_digits) for n in expr.atoms(sy.Number)})
```

# <font face="gotham" color="purple"> Matrix Operations</font>

Matrix _addition_ operations are straightforward:
1. $A+ B= B+ A$
2. $(A+B)+ C=A+(B+C)$
3. $c(A+B)=cA+cB$
4. $(c+d)A=cA+c{D}$
5. $c(dA)=(cd)A$
6. $A+{0}=A$, where ${0}$ is the zero matrix
7. For any $A$, there exists an $- A$, such that $ A+(- A)=0$.

They are as obvious as it looks, so no proofs are provided. And the matrix _multiplication_ properties are:
1. $ A({BC})=({AB}) C$
2. $c({AB})=(cA)B=A(cB)$
3. $A(B+ C)={AB}+{AC}$
4. $(B+C)A={BA}+{CA}$

Note that we need to differentiate two kinds of multiplication, **Hadamard multiplication** (element-wise multiplication) and **matrix multiplication**: 


```python
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
```


```python
A*B # this is Hadamard elementwise product
```




    array([[ 5, 12],
           [21, 32]])




```python
A@B # this is matrix product
```




    array([[19, 22],
           [43, 50]])



We show explicitly the matrix multiplication rule:


```python
np.sum(A[0,:]*B[:,0]) # (1, 1)
np.sum(A[1,:]*B[:,0]) # (2, 1)
np.sum(A[0,:]*B[:,1]) # (1, 2)
np.sum(A[1,:]*B[:,1]) # (2, 2)
```




    19






    43






    22






    50



## <font face="gotham" color="purple"> SymPy Demonstration: Addition </font>

Let's define all the letters as symbols in case we might use them repetitively.


```python
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z = sy.symbols('a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z', real = True)
```


```python
A = sy.Matrix([[a, b, c], [d, e, f]])
A + A
A - A
```




$\displaystyle \left[\begin{matrix}2 a & 2 b & 2 c\\2 d & 2 e & 2 f\end{matrix}\right]$






$\displaystyle \left[\begin{matrix}0 & 0 & 0\\0 & 0 & 0\end{matrix}\right]$




```python
B = sy.Matrix([[g, h, i], [j, k, l]])
A + B
A - B
```




$\displaystyle \left[\begin{matrix}a + g & b + h & c + i\\d + j & e + k & f + l\end{matrix}\right]$






$\displaystyle \left[\begin{matrix}a - g & b - h & c - i\\d - j & e - k & f - l\end{matrix}\right]$



## <font face="gotham" color="purple"> SymPy Demonstration: Multiplication </font>

The matrix multiplication rules can be clearly understood by using symbols.


```python
A = sy.Matrix([[a, b, c], [d, e, f]])
B = sy.Matrix([[g, h, i], [j, k, l], [m, n, o]])
A
B
```




$\displaystyle \left[\begin{matrix}a & b & c\\d & e & f\end{matrix}\right]$






$\displaystyle \left[\begin{matrix}g & h & i\\j & k & l\\m & n & o\end{matrix}\right]$




```python
AB = A*B; AB
```




$\displaystyle \left[\begin{matrix}a g + b j + c m & a h + b k + c n & a i + b l + c o\\d g + e j + f m & d h + e k + f n & d i + e l + f o\end{matrix}\right]$



## <font face="gotham" color="purple"> Commutability </font>

The matrix multiplication usually do not commute, such that ${AB} \neq {BA}$. For instance, consider $ A$ and $ B$:


```python
A = sy.Matrix([[3, 4], [7, 8]])
B = sy.Matrix([[5, 3], [2, 1]])
A*B
B*A
```




$\displaystyle \left[\begin{matrix}23 & 13\\51 & 29\end{matrix}\right]$






$\displaystyle \left[\begin{matrix}36 & 44\\13 & 16\end{matrix}\right]$



How do we find a commutable matrix?


```python
A = sy.Matrix([[a, b], [c, d]])
B = sy.Matrix([[e, f], [g, h]])
A*B
B*A
```




$\displaystyle \left[\begin{matrix}a e + b g & a f + b h\\c e + d g & c f + d h\end{matrix}\right]$






$\displaystyle \left[\begin{matrix}a e + c f & b e + d f\\a g + c h & b g + d h\end{matrix}\right]$



To show ${AB} = {BA}$, we need to prove ${AB} - {BA} = 0$


```python
M = A*B - B*A; M
```




$\displaystyle \left[\begin{matrix}b g - c f & a f - b e + b h - d f\\- a g + c e - c h + d g & - b g + c f\end{matrix}\right]$



That means
\begin{align}
b g - c f&=0 \\
 a f - b e + b h - d f&=0\\
- a g + c e - c h + d g&=0 \\
- b g + c f&=0
\end{align}

If we treat $a, b, c, d$ as coefficients of the system, we and extract an augmented matrix


```python
A_aug = sy.Matrix([[0, -c, b, 0], [-b, a-d, 0, b], [c, 0, d -a, -c], [0, c, -b, 0]]); A_aug
```




$\displaystyle \left[\begin{matrix}0 & - c & b & 0\\- b & a - d & 0 & b\\c & 0 & - a + d & - c\\0 & c & - b & 0\end{matrix}\right]$



Perform **Gaussian-Jordon** elimination till row reduced formed.


```python
A_aug.rref()
```




$\displaystyle \left( \left[\begin{matrix}1 & 0 & - \frac{a}{c} + \frac{d}{c} & -1\\0 & 1 & - \frac{b}{c} & 0\\0 & 0 & 0 & 0\\0 & 0 & 0 & 0\end{matrix}\right], \  \left( 0, \  1\right)\right)$



The general solution is 
\begin{align}
e - \frac{a-d}cg - h &=0\\
f - \frac{b}{c} & =0\\
g &= free\\
h & =free
\end{align}

if we set coefficients $a = 10, b = 12, c = 20, d = 8$, or $ A = \left[\begin{matrix}10 & 12\\20 & 8\end{matrix}\right]$ then general solution becomes


\begin{align}
e - .1g - h &=0\\
f - .6 & =0\\
g &= free\\
h & =free
\end{align}
Then try a special solution when $g = h = 1$
\begin{align}
e  &=1.1\\
f & =.6\\
g &=1 \\
h & =1
\end{align}
And this is a **commutable matrix of $A$**, we denote $ C$.


```python
C = sy.Matrix([[1.1, .6], [1, 1]]);C
```




$\displaystyle \left[\begin{matrix}1.1 & 0.6\\1 & 1\end{matrix}\right]$



Now we can see that ${AC}={CA}$.


```python
A = sy.Matrix([[10, 12], [20, 8]])
A*C
C*A
```




$\displaystyle \left[\begin{matrix}23.0 & 18.0\\30.0 & 20.0\end{matrix}\right]$






$\displaystyle \left[\begin{matrix}23.0 & 18.0\\30 & 20\end{matrix}\right]$



# <font face="gotham" color="purple"> Transpose of Matrices </font>

Matrix $A_{n\times m}$ and its transpose is 


```python
A = np.array([[1, 2, 3], [4, 5, 6]]); A
A.T # transpose
```




    array([[1, 2, 3],
           [4, 5, 6]])






    array([[1, 4],
           [2, 5],
           [3, 6]])




```python
A = sy.Matrix([[1, 2, 3], [4, 5, 6]]); A
A.transpose()
```




$\displaystyle \left[\begin{matrix}1 & 2 & 3\\4 & 5 & 6\end{matrix}\right]$






$\displaystyle \left[\begin{matrix}1 & 4\\2 & 5\\3 & 6\end{matrix}\right]$



The properties of transpose are
1. $(A^T)^T$
2. $(A+B)^T=A^T+B^T$
3. $(cA)^T=cA^T$
4. $(AB)^T=B^TA^T$

We can show why the last property holds with SymPy, define $A$ and $B$, multiply them, then transpose, that means $(AB)^T$


```python
A = sy.Matrix([[a, b], [c, d], [e, f]])
B = sy.Matrix([[g, h, i], [j, k, l]])
AB = A*B
AB_tr = AB.transpose(); AB_tr
```




$\displaystyle \left[\begin{matrix}a g + b j & c g + d j & e g + f j\\a h + b k & c h + d k & e h + f k\\a i + b l & c i + d l & e i + f l\end{matrix}\right]$



Transpose each of them, then multiply, that means $B^TA^T$


```python
B_tr_A_tr = B.transpose()*A.transpose()
B_tr_A_tr
```




$\displaystyle \left[\begin{matrix}a g + b j & c g + d j & e g + f j\\a h + b k & c h + d k & e h + f k\\a i + b l & c i + d l & e i + f l\end{matrix}\right]$



To see if they are equal


```python
AB_tr - B_tr_A_tr
```




$\displaystyle \left[\begin{matrix}0 & 0 & 0\\0 & 0 & 0\\0 & 0 & 0\end{matrix}\right]$



# <font face="gotham" color="purple"> Identity Matrices </font>

This is an identity matrix $I_5$


```python
sy.eye(5)
```




$\displaystyle \left[\begin{matrix}1 & 0 & 0 & 0 & 0\\0 & 1 & 0 & 0 & 0\\0 & 0 & 1 & 0 & 0\\0 & 0 & 0 & 1 & 0\\0 & 0 & 0 & 0 & 1\end{matrix}\right]$



Identity matrix properties:

$$
AI=IA = A
$$

Let's generate $ I$ and $ A$ and show if it holds


```python
I = np.eye(5); I
```




    array([[1., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0.],
           [0., 0., 1., 0., 0.],
           [0., 0., 0., 1., 0.],
           [0., 0., 0., 0., 1.]])




```python
A = np.around(np.random.rand(5, 5)*100); A # generate a random matrix
```




    array([[59., 75., 69., 73., 34.],
           [94.,  8., 73.,  6., 10.],
           [73., 23., 55., 27., 67.],
           [ 1., 36., 25., 68., 75.],
           [35., 10., 33., 31., 79.]])



Apparently it holds


```python
A@I - I@A
```




    array([[0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.]])



# <font face="gotham" color="purple"> Elementary Matrix </font>

An **elementary matrix** is a matrix that can be obtained from a single elementary row operation on an identity matrix. Such as:

$$
\left[\begin{matrix}1 & 0 & 0\cr 0 & 1 & 0\cr 0 & 0 & 1\end{matrix}\right]\ \matrix{R_1\leftrightarrow R_2\cr ~\cr ~}\qquad\Longrightarrow\qquad \left[\begin{matrix}0 & 1 & 0\cr 1 & 0 & 0\cr 0 & 0 & 1\end{matrix}\right]
$$

where $R_1\leftrightarrow R_2$ means exchanging row $1$ and row $2$, and we denote the transformed matrix as ${E}$, then left multiply $  E$ onto a matrix $  A$. Generate $ A$ first


```python
A = sy.randMatrix(3, percent = 80); A # generate a random matrix with 80% of entries being nonzero
```




$\displaystyle \left[\begin{matrix}34 & 5 & 0\\34 & 67 & 4\\14 & 32 & 44\end{matrix}\right]$



Create an elementary matrix with $R_1\leftrightarrow R_2$


```python
E = sy.Matrix([[0, 1, 0], [1, 0, 0], [0, 0, 1]]);E
```




$\displaystyle \left[\begin{matrix}0 & 1 & 0\\1 & 0 & 0\\0 & 0 & 1\end{matrix}\right]$



It turns out that by left-multiplying $ E$ onto $ A$, $ A$ also switches the row $1$ and $2$. 


```python
E*A
```




$\displaystyle \left[\begin{matrix}34 & 67 & 4\\34 & 5 & 0\\14 & 32 & 44\end{matrix}\right]$



Adding a multiple of a row onto another row in the identity matrix also gives us an elementary matrix.

$$
\left[\begin{matrix}1 & 0 & 0\cr 0 & 1 & 0\cr 0 & 0 & 1\end{matrix}\right]\ \matrix{~\cr ~\cr R_3-7R_1}\qquad\longrightarrow\left[\begin{matrix}1 & 0 & 0\cr 0 & 1 & 0\cr -7 & 0 & 1\end{matrix}\right]
$$

Let's verify with SymPy.


```python
A = sy.randMatrix(3, percent = 80); A
E = sy.Matrix([[1, 0, 0], [0, 1, 0], [-7, 0, 1]]); E
```




$\displaystyle \left[\begin{matrix}72 & 31 & 34\\25 & 12 & 7\\54 & 8 & 0\end{matrix}\right]$






$\displaystyle \left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\-7 & 0 & 1\end{matrix}\right]$




```python
E*A
```




$\displaystyle \left[\begin{matrix}72 & 31 & 34\\25 & 12 & 7\\-450 & -209 & -238\end{matrix}\right]$



We can also show this by explicit row operation on $ A$.


```python
EA = sy.matrices.MatrixBase.copy(A)
EA[2,:]=-7*EA[0,:]+EA[2,:]
EA
```




$\displaystyle \left[\begin{matrix}72 & 31 & 34\\25 & 12 & 7\\-450 & -209 & -238\end{matrix}\right]$



In next section, we will see an important conclusion of elementary matrices multiplication is that an **invertible matrix** is a product of a series of elementary matrices.

# <font face="gotham" color="purple"> Inverse Matrices </font>

If ${AB}={BA}=\mathbf{I}$, $ B$ is called the inverse of matrix $  A$, denoted as $ B=  A^{-1}$.


NumPy has convenient function ```np.linalg.inv()``` for computing inverse matrices. Generate $ A$


```python
A = np.round(10*np.random.randn(5,5)); A
```




    array([[ -1.,  -8.,  -6.,  -2., -16.],
           [ -1.,  -2.,   8., -13.,   4.],
           [  1.,  11., -13.,   2.,   3.],
           [ -1., -13.,   6.,   8.,   9.],
           [-12.,   9.,  -4.,  -1.,   7.]])




```python
Ainv = np.linalg.inv(A); Ainv
```




    array([[-0.026,  0.013,  0.042, -0.005, -0.078],
           [-0.048, -0.038, -0.034, -0.064,  0.01 ],
           [-0.05 , -0.034, -0.096, -0.043,  0.003],
           [-0.026, -0.08 , -0.04 , -0.002,  0.006],
           [-0.015,  0.041,  0.055,  0.049, -0.002]])



Verify if they are truly inverse of each other


```python
A@Ainv
```




    array([[ 1.,  0., -0.,  0., -0.],
           [-0.,  1.,  0., -0.,  0.],
           [-0.,  0.,  1.,  0.,  0.],
           [ 0.,  0.,  0.,  1., -0.],
           [ 0., -0., -0.,  0.,  1.]])



The ```-0.``` means there are more digits after point, but omitted here.

## <font face="gotham" color="purple"> $[A\,|\,I]\sim [I\,|\,A^{-1}]$ Algorithm </font>

A convenient way of calculating inverse is that we can construct an augmented matrix $[ A\,|\,\mathbf{I}]$, then multiply a series of $ E$'s which are elementary row operations till matrix $A$ becomes row reduced form, if full rank it means $ A \rightarrow \mathbf{I}$. Then $\mathbf{I}$ on the RHS of augmented matrix will be converted into $ A^{-1}$ automatically. 

We can show with SymPy's ```.rref()``` function on the augmented matrix $[A\,|\,I]$.


```python
AI = np.hstack((A, I)) # stack the matrix A and I horizontally
AI = sy.Matrix(AI); AI
```




$\displaystyle \left[\begin{matrix}-1.0 & -8.0 & -6.0 & -2.0 & -16.0 & 1.0 & 0.0 & 0.0 & 0.0 & 0.0\\-1.0 & -2.0 & 8.0 & -13.0 & 4.0 & 0.0 & 1.0 & 0.0 & 0.0 & 0.0\\1.0 & 11.0 & -13.0 & 2.0 & 3.0 & 0.0 & 0.0 & 1.0 & 0.0 & 0.0\\-1.0 & -13.0 & 6.0 & 8.0 & 9.0 & 0.0 & 0.0 & 0.0 & 1.0 & 0.0\\-12.0 & 9.0 & -4.0 & -1.0 & 7.0 & 0.0 & 0.0 & 0.0 & 0.0 & 1.0\end{matrix}\right]$




```python
AI_rref = AI.rref(); AI_rref
```




$\displaystyle \left( \left[\begin{matrix}1 & 0 & 0 & 0 & 0 & -0.0257937689879073 & 0.0134627985941502 & 0.0420563531303985 & -0.00488473223327575 & -0.0783939953535474\\0 & 1 & 0 & 0 & 0 & -0.0475017432957576 & -0.0379022282648688 & -0.0338111774166985 & -0.0638116329512683 & 0.00961703559126635\\0 & 0 & 1 & 0 & 0 & -0.0496953174550335 & -0.0339723665721724 & -0.0957148213428458 & -0.0433738992707943 & 0.00261056349626286\\0 & 0 & 0 & 1 & 0 & -0.0259829910399854 & -0.0804474050298025 & -0.0399608941092372 & -0.00152428875285147 & 0.00566614922611685\\0 & 0 & 0 & 0 & 1 & -0.0152533998647413 & 0.04090525231359 & 0.0551652364049212 & 0.0486668605608682 & -0.00159612305039964\end{matrix}\right], \  \left( 0, \  1, \  2, \  3, \  4\right)\right)$



Extract the RHS block, this is the $A^{-1}$.


```python
Ainv = AI_rref[0][:,5:];Ainv # extract the RHS block
```




$\displaystyle \left[\begin{matrix}-0.0257937689879073 & 0.0134627985941502 & 0.0420563531303985 & -0.00488473223327575 & -0.0783939953535474\\-0.0475017432957576 & -0.0379022282648688 & -0.0338111774166985 & -0.0638116329512683 & 0.00961703559126635\\-0.0496953174550335 & -0.0339723665721724 & -0.0957148213428458 & -0.0433738992707943 & 0.00261056349626286\\-0.0259829910399854 & -0.0804474050298025 & -0.0399608941092372 & -0.00152428875285147 & 0.00566614922611685\\-0.0152533998647413 & 0.04090525231359 & 0.0551652364049212 & 0.0486668605608682 & -0.00159612305039964\end{matrix}\right]$



I wrote a function to round the float numbers to the $4$th digits, on the top of this file, but this is not absolutely necessary.


```python
round_expr(Ainv, 4) 
```




$\displaystyle \left[\begin{matrix}-0.0258 & 0.0135 & 0.0421 & -0.0049 & -0.0784\\-0.0475 & -0.0379 & -0.0338 & -0.0638 & 0.0096\\-0.0497 & -0.034 & -0.0957 & -0.0434 & 0.0026\\-0.026 & -0.0804 & -0.04 & -0.0015 & 0.0057\\-0.0153 & 0.0409 & 0.0552 & 0.0487 & -0.0016\end{matrix}\right]$



We can verify if $AA^{-1}=\mathbf{I}$


```python
A = sy.Matrix(A)
round_expr(A*Ainv, 4) 
```




$\displaystyle \left[\begin{matrix}1.0 & 0 & 0 & 0 & 0.0\\0.0 & 1.0 & 0.0 & 0 & 0.0\\0.0 & 0.0 & 1.0 & 0.0 & 0.0\\0.0 & 0.0 & 0.0 & 1.0 & 0.0\\0.0 & 0 & 0 & 0.0 & 1.0\end{matrix}\right]$



We got $\mathbf{I}$, which means the RHS block is indeed $A^{-1}$.

## <font face="gotham" color="purple"> An Example of Existence of Inverse </font>

Determine the values of $\lambda$ such that the matrix
$$A=\left[ \begin{matrix}3 &\lambda &1\cr 2 & -1 & 6\cr 1 & 9 & 4\end{matrix}\right]$$
is not invertible.

Still,we are using SymPy to solve the problem.


```python
lamb = sy.symbols('lamda') # SymPy will automatically render into LaTeX greek letters
A = np.array([[3, lamb, 1], [2, -1, 6], [1, 9, 4]])
I = np.eye(3); A
```




    array([[3, lamda, 1],
           [2, -1, 6],
           [1, 9, 4]], dtype=object)



Form the augmented matrix.


```python
AI = np.hstack((A, I))
AI = sy.Matrix(AI); AI
```




$\displaystyle \left[\begin{matrix}3 & \lambda & 1 & 1.0 & 0.0 & 0.0\\2 & -1 & 6 & 0.0 & 1.0 & 0.0\\1 & 9 & 4 & 0.0 & 0.0 & 1.0\end{matrix}\right]$




```python
AI_rref = AI.rref()
AI_rref
```




$\displaystyle \left( \left[\begin{matrix}1 & 0 & 0 & \frac{116.0}{4.0 \lambda + 310.0} & \frac{8.0 \lambda - 18.0}{4.0 \lambda + 310.0} & \frac{- 12.0 \lambda - 2.0}{4.0 \lambda + 310.0}\\0 & 1 & 0 & \frac{4.0}{4.0 \lambda + 310.0} & - \frac{22.0}{4.0 \lambda + 310.0} & \frac{32.0}{4.0 \lambda + 310.0}\\0 & 0 & 1 & \frac{57.0}{- 6 \lambda - 465} & \frac{27.0 - 1.0 \lambda}{2.0 \lambda + 155.0} & \frac{2.0 \lambda + 3.0}{2.0 \lambda + 155.0}\end{matrix}\right], \  \left( 0, \  1, \  2\right)\right)$



To make the matrix $A$ invertible we notice that is one conditions to be satisfied (in the denominators):
\begin{align}
-6\lambda -465 &\neq0\\
\end{align}

Solve for $\lambda$'s.


```python
sy.solvers.solve(-6*lamb-465, lamb)
```

So this is one of $\lambda$ that cause the matrix invertible. Let's test with **determinant**. If $| A|=0$, then the matrix is not invertible. Don't worry about determinants, we will get back to this. 


```python
A = np.array([[3, -155/2, 1], [2, -1, 6], [1, 9, 4]])
np.linalg.det(A)
```

The $| A|$ is $0$. 

So we found that one condition, as long as $\lambda \neq -\frac{155}{2}$, the matrix $A$ is invertible.

## <font face="gotham" color="purple"> Properties of Inverse Matrices </font>

1. If $A$ and $B$ are both invertible, then $(AB)^{-1}=B^{-1}A^{-1}$.
2. If $A$ is invertible, then $(A^T)^{-1}=(A^{-1})^T$.
3. If $A$ and $B$ are both invertible and symmetric such that $AB=BA$, then $A^{-1}B$ is symmetric.

The _first property_ is straightforward
\begin{align}
ABB^{-1}A^{-1}=AIA^{-1}=I=AB(AB)^{-1}
\end{align}

The trick of _second property_ is to show that
$$
A^T(A^{-1})^T = I
$$
We can use the property of transpose
$$
A^T(A^{-1})^T=(A^{-1}A)^T = I^T = I
$$

The _third property_ is to show
$$
A^{-1}B = (A^{-1}B)^T
$$
Again use the property of transpose
$$
(A^{-1}B)^{T}=B^T(A^{-1})^T=B(A^T)^{-1}=BA^{-1}
$$
We use the $AB = BA$ condition to proceed
\begin{align}
AB&=BA\\
A^{-1}ABA^{-1}&=A^{-1}BAA^{-1}\\
BA^{-1}&=A^{-1}B
\end{align}
The plug in the previous equation, we have
$$
(A^{-1}B)^{T}=BA^{-1}=A^{-1}B
$$

6be1f5c3e02c14c4388f91d95cbec67a12c3aba2
ipynb
Jupyter Notebook
Chapter 2 - Basic Matrix Algebra.ipynb
testinggg-art/Linear_Algebra_With_Python
bd5c6bdac07e65b52e92960aee781f63489a0260
MIT
2020-12-30T07:26:45.000Z
2022-03-31T21:05:57.000Z
Chapter 2 - Basic Matrix Algebra.ipynb
testinggg-art/Linear_Algebra_With_Python
bd5c6bdac07e65b52e92960aee781f63489a0260
MIT
2021-01-13T00:02:03.000Z
2021-01-13T00:02:03.000Z
Chapter 2 - Basic Matrix Algebra.ipynb
testinggg-art/Linear_Algebra_With_Python
bd5c6bdac07e65b52e92960aee781f63489a0260
MIT
2020-12-30T07:27:23.000Z
2022-03-01T17:40:41.000Z
Qwen/Qwen-72B
1. YES
2. YES