查阅numpy函数使用的博客:
Numpy线性代数:https://blog.csdn.net/pianoorrock/article/details/79223080
numpy基本方法总结:https://blog.csdn.net/blog_empire/article/details/39298557
生成矩阵A和B,A由随机高斯项组成,B为toeplitz矩阵
n,m值调整至10,15,便于测试
import numpy as np
import numpy.matlib
import scipy
import time
import math
from scipy.linalg import toeplitz
n = 10
m = 15
temp = np.matlib.rand(1,m)
A = np.matlib.randn(n, m) #生成A
B = toeplitz(temp) #生成B
print("Matrix A:")
print(A)
print("Matrix B:")
print(B)
print("\n")
Exercise_9_1
常规的矩阵运算
def Exercise_9_1(k):
print("Exercise[9.1]:")
print("A+A:") #A+A
print(A+A)
print("AA^T:") #AA^T
print(A*A.T)
print("A^T*A:") #A^T*A
print(A.T*A)
print("AB:") #AB
print(A*B)
print("A(B-kI) for k = " + str(k))
print(A * (B - k * np.matlib.identity(m)))
print("\n")
Exercise_9_1(1)
Exercise_9_2
线性方程求解,用numpy.linalg.solve求解方程
def Exercise_9_2():
print("Exercise[9.2]:")
b = np.matlib.rand(m, 1) #随机生成向量b
print("vector b:")
print(b)
x = np.linalg.solve(B, b)#用numpy.linalg.solve求解方程
print("The x of B*x = b is :")
print(x)
print("\n")
Exercise_9_2()
Exercise_9_3
求A,B的范数 和 B的奇异值的max和min
def Exercise_9_3(F):
print("Exercise_9_3")
print("||A||"+str(F)+" :")
print(np.linalg.norm(A, F)) #用numpy.linalg.norm求范数,求A的F范数
print("||B||∞ : ")
print(np.linalg.norm(B, np.inf))#numpy的inf表示无穷,即求无穷范数
print("singular value of B is :")
u,s,v= np.linalg.svd(B,full_matrices=True) #求奇异值,由svd函数进行svd分解可得
print("max:")
print(max(s))
print("min:")
print(min(s))
Exercise_9_3(2)
Exercise_9_4
用高斯项生成矩阵Z,n×n,用幂迭代法求Z的最大特征值和相应的特征向量,直到收敛为止需要多少次迭代?
def Exercise_9_4(n):
start = time.clock()
Z = np.matlib.randn(n, n)
u = np.matlib.rand(n, 1)
print("Matrix Z:")
print(Z)
t1 = 0
t2 = 1
count = 0
while math.fabs(t1 - t2) > 1e-10:
count = count + 1
v = Z * u
t1 = t2
t2 = max(np.abs(v))
u = v / t2
end = time.clock();
print("iterations count : " + str(count))
print("max eigenvalue : "+ str(t2))
print("corresponding eigenvalue : ")
print(u)
print("Time used : " + str(end - start))
Exercise_9_4(10)
此处测试n=10时,迭代次数为80(随机性很强,n=10时迭代次数也不定。。。。)
Exercise_9_5
numpy.random里的二项分布生成C矩阵
#求奇异值,由svd函数进行svd分解可得
def Exercise_9_5(n,p):
print("n : " + str(n) + " p : " + str(p))
C = np.random.binomial(1,p,(n,n))
print("Matrix C:")
print(C)
u, s, v = np.linalg.svd(C)
print("max singular value of C is :")
print(max(s) )
Exercise_9_5()
Exercise_9_6
def Exercise_9_6(A, z):
print("Matrix A :")
print(A)
print("z : " + str(z))
print(A[0, np.argmin(np.abs(A-z))])
print()
Exercise_9_6(A, z)
由提示可得,先取差值,得到矩阵A-z,取绝对值,元素则表示z到A矩阵该位置元素的距离,再利用numpy.argmin函数得到最小值下标,再取元素值即可