import numpy as np
from scipy.linalg import toeplitz
n = 200
m = 500
A = np.random.normal(loc=0, scale=1, size=(n,m))
B = toeplitz(np.random.random(m), np.random.random(m))
print('Matrix A:\n', A, end='\n\n')
print('Matrix B:\n', B, end='\n\n')
print('------------------------------------------------')
print('Exercise 9.1\n')
print('A+A:\n', A+A, end='\n\n')
print('AAT:\n', np.dot(A, A.T), end='\n\n')
print('ATA:\n', np.dot(A.T, A), end='\n\n')
print('AB:\n', np.dot(A, B), end='\n\n')
def f1(A, B, Lambda):
return np.dot(A, B-Lambda*np.eye(m))
print('B(A-Lambda*I):\n', f1(A, B, 2), end='\n\n')
print('------------------------------------------------')
print('Exercise 9.2\n')
b = np.random.random(m)
ans2 = np.linalg.solve(B, b)
print('With a ramdom vector b, the answer of Bx = b is:')
print(ans2, end='\n\n')
print('------------------------------------------------')
print('Exercise 9.3\n')
a = np.linalg.norm(A, 'fro')
b = np.linalg.norm(B, np.inf)
s = np.linalg.svd(B)[1]
Max = np.max(s)
Min = np.min(s)
print('The Frobenius norm of A:\n', a)
print('The infinity norm of B:\n', b)
print('Largest singular value of B:\n', Max)
print('Smallest singular value of B:\n', Min, end='\n\n')
print('------------------------------------------------')
print('Exercise 9.4\n')
import time
def power_iteration(A):
iter_count = 0
b_k = np.random.rand(A.shape[1])
while(True):
b_k1 = np.dot(A, b_k)
b_k1_norm = 0
b_k1_norm_temp = b_k1_norm
b_k1_norm = np.linalg.norm(b_k1)
b_k = b_k1 / b_k1_norm
iter_count += 1
if abs(b_k1_norm_temp - b_k1_norm) < 0.0001:
break
return iter_count, b_k1_norm, b_k
n6 = 4
Z = np.random.random(size=(n6, n6))
begin = time.clock()
count, value, vector = power_iteration(Z)
end = time.clock()
print('Z:\n', Z)
print('\nThe largest eigenvalue: ', value)
print('The corresponding eigenvector: ', vector)
print('Iteration count: ', count)
print('Time: ', end-begin)
print('------------------------------------------------')
print('Exercise 9.5\n')
from scipy.linalg import svdvals
n, p = 5, 0.5
c = np.zeros((n, n))
for i in range(n):
for j in range(n):
x = np.random.rand()
c[i][j] = 1 if x < p else 0
print('C:\n', c)
print('\nSingular values of C:\n', svdvals(c))
print('------------------------------------------------')
print('Exercise 9.6\n')
z = np.random.random()
print('z=', z)
idx = np.argmin(np.abs(A-z))
print(A[idx//A.shape[0]][idx%A.shape[1]])