This homework covers the material in Lessons 3 & 4. It is due **Thurday, June 15**. Please submit your **answers as a PDF**.

1. Modify the LU method (without pivoting) to work **in-place**. That is, it should not allocate any new memory for L or U, but instead overwrite A.

In [ ]:

```
def LU(A):
U = np.copy(A)
m, n = A.shape
L = np.eye(n)
for k in range(n-1):
for j in range(k+1,n):
L[j,k] = U[j,k]/U[k,k]
U[j,k:n] -= L[j,k] * U[k,k:n]
return L, U
```

2. Modify our LU method from class to add pivoting, as described in the lesson. *Hint: the swap method below will be useful*

In [ ]:

```
def swap(a,b):
temp = np.copy(a)
a[:] = b
b[:] = temp
```

3. For each of the following sets of dimensions, either

- give the dimensions of the output of an operation on A and B,
**or** - answer
*incompatible*if the dimensions are incompatible according to the numpy rules of broadcasting.

```
a. A (2d array): 3 x 3
B (1d array): 1
b. A (2d array): 2 x 1
B (3d array): 6 x 4 x 2
c. A (2d array): 5 x 4
B (1d array): 4
d. A (3d array): 32 x 64 x 8
B (3d array): 32 x 1 x 8
e. A (3d array): 64 x 1
B (3d array): 32 x 1 x 16
f. A (3d array): 32 x 64 x 2
B (3d array): 32 x 1 x 8
```

4. Write how this matrix would be stored in compressed row format:

\begin{pmatrix} 1 & & & & -2 & -3 \\ & 3 & & & & -9 \\ & & & -7 & 4 & \\ -1 & 2 & & 7 & & \\ -3 & & & 26 & & \end{pmatrix}