【前置条件】
按照题意,不妨将矩阵A初始化为元素服从标准高斯分布(标准正态分布)的n*m矩阵,将矩阵B初始化为首行为[0, 1, 2, ..., 499]的m*m托普利兹矩阵。
import numpy as np
from scipy.linalg import toeplitz
n = 200
m = 500
A = np.random.randn(n, m) # 元素服从标准高斯分布
B = toeplitz(list(range(0, 500))) # m*m托普利兹矩阵
【问题解决】
python的常用矩阵运算可参考https://blog.csdn.net/ml_algorithmresearch/article/details/50602419
print(A + A)
print(np.dot(A, A.T))
print(np.dot(A.T, A))
print(np.dot(A, B))
def fun(lamb):
C = B - lamb * np.ones((m, m))
return (np.dot(A, C))
print(fun(2)) # 当lamb = 2时
b = np.random.rand(m, 1) # 随机生成m*1矩阵
x = np.linalg.solve(B, b) # 求解Bx = b
print(x)
范数运算相关知识可参考以下两篇博文:
print(np.linalg.norm(A, 'fro')) # A的弗罗贝尼乌斯范数
print(np.linalg.norm(B, np.inf)) # B的无穷范数
# 奇异值(USV)分解
U,sigma,VT = np.linalg.svd(B)
smax = max(sigma)
smin = min(sigma)
幂法求解矩阵特征值和特征向量的原理可参考https://blog.csdn.net/luckisok/article/details/1602266
# 求Z(n*n矩阵)的特征值与特征向量
def power_iteration(n):
'''
lamb:特征值
u:特征向量
ite_num:迭代次数
end-begin:运算时间
'''
Z = np.random.randn(n,n)
u = np.ones(n)
lamb = 0
ite_num = 0
begin = time.clock()
while True:
v = np.dot(Z, u)
lamb_old = lamb
lamb = np.linalg.norm(v, np.inf)
u = v / lamb
ite_num += 1
if abs(lamb - lamb_old) < 0.0001:
break
end = time.clock()
return lamb, u, ite_num, end - begin
print(power_iteration(100))
def fun(n, p):
C = np.random.binomial(1, p, (n,n)) # 元素服从二项分布
U, sigma, VT = np.linalg.svd(C)
smax = max(sigma)
return sigma, smax
print(fun(100, 0.5))
提示中numpy模块的argmax 函数是用来求一个array中最大值的下标。
# 求数组A中最接近z的元素
def fun(z, A):
B = abs(A - z)
index = np.argmin(B)
return A[index]
A = np.array([1, 2, 3, 4])
z = 2.8
print(fun(z, A))