Generate matrices
A
, with random Gaussian entries,
B
, a Toeplitz matrix, where
A
R
n
×
m
and
B
R
m
×
m
,
for n = 200, m = 500. 为了显示方便,用规模小一点的矩阵,n=10,m=25
from scipy.linalg import toeplitz
import numpy as np
#选用服从 N(0,1)的正态分布 , 生成之后 reshape
A = np.random.normal(0,1,100000)
A = A.reshape(200,500)
B = toeplitz(list(range(1,501)))
A2 = A+A
AAt = A@A.T
AtA = A.T@A
AmB = A@B
def compute(A,B,lam):
temp = B-lam*np.eye(500)
return A@temp
print(compute(A,B,3))
在上面基础上,加上:
b = np.array(list(range(1,501)))
x = np.linalg.solve(B,b)
norm(矩阵,哪种范数) , Frobenius范数就是'fro', 无穷范数就是np.inf 。然后就是svd分解函数,full_matrices=True就是全部分解
na = np.linalg.norm(A,'fro')
nb = np.linalg.norm(B,np.inf)
u, s, vh = np.linalg.svd(B,full_matrices=True)
maxvalue = max(s)
minvalue = min(s)
就是用幂法求主特征值和主特征向量,数值计算刚刚学过就用上了,精度设置为1e-4,返回值为
lam:主特征值
u:规格化之后的主特征向量
cnt: 迭代次数
cost:使用的时间
n = 100
Z = np.random.normal(5,1,n*n).reshape(n,n)
def powerit(Z,n):
from time import clock
start = clock()
u = np.random.normal(5,1,n)
last = 1000
lam = 0
cnt = 0
while abs(last-lam) > 0.0001:
cnt = cnt+1
v = Z@u
big = -1
last = lam
for vv in v:
if abs(vv)>big:
lam = vv
big = abs(vv)
u = v/lam
end = clock()
return lam, u, cnt, end-start
n=100时,只用6次就收敛了。。。
改成n=1000,甚至精度改成了1e-10,也只用了8次.....这个收敛速度是真的快.....
写到这里才发现生成正态分布矩阵的参数中有一个size参数 可以直接生成2维矩阵........
0-1分布是一种特殊的二项分布,而numpy.random里只有二项分布,所以就用n=1的二项分布生成。。。
for n in (10,50,100):
for p in (0.2,0.5,0.8):
print("n = %d, p = %.3f" % (n,p))
C = np.random.binomial(1,p,(n,n))
u, s, vh = np.linalg.svd(C,full_matrices=True)
maxvalue = max(s)
print(maxvalue)
结果是:
可以看到随着n和p的增加,最大奇异值maxvalue也会增加。
而且好像是成倍增加的!!!
大概是 maxvalue = t * n * p的形式
def closest(A,z):
B = A - z
idx = np.argmin(np.abs(B))
return A[idx]
提示说用argmin,就是获取最小值的下标,而离z最近的元素,就是先把A每项都减去z,然后取绝对值,哪一项绝对值最小哪一项就离z最近,然后通过argmin获取下标,返回原矩阵A中的idx下标的值就可以了。