文章目录
思路
如何生成随机对称正定矩阵?
- 随机生成一个单位正交阵A
- 随机生成一个对角元素均大于0的对角矩阵B(这个更容易了,就是生成几个随机正数而已)
- C = A ∗ B ∗ A C=A*B*A C=A∗B∗A即为一个正定矩阵,同时也是一个对称矩阵。
1.生成一个随机稀疏单位正交阵
1.1生成稀疏矩阵
def sprandsym_b(m,n,density):
rvs = stats.norm().rvs #从正太分布中生成随机数
X = sparse.random(m,n, density=density, data_rvs=rvs) #生成随机稀疏矩阵
A = X.todense()
return A
1.2 生成稀疏对称矩阵
def sprandsym(m,n,density):
rvs = stats.norm().rvs #从正太分布中生成随机数
X = sparse.random(m,n, density=density, data_rvs=rvs) #生成随机稀疏矩阵
#A = X.todense()
upper_X = sparse.triu(X)
result = upper_X + upper_X.T - sparse.diags(X.diagonal())
result = result.todense()
return result
1.3 生成正交阵
def householder_reflection(A):
"""Householder变换"""
(r, c) = np.shape(A)
Q = np.identity(r)
R = np.copy(A)
for cnt in range(r - 1):
x = R[cnt:, cnt]
e = np.zeros_like(x)
e[0] = np.linalg.norm(x)
u = x - e
v = u / np.linalg.norm(u)
Q_cnt = np.identity(r)
Q_cnt[cnt:, cnt:] -= 2.0 * np.outer(v, v)
R = np.dot(Q_cnt, R) # R=H(n-1)*...*H(2)*H(1)*A
Q = np.dot(Q, Q_cnt) # Q=H(n-1)*...*H(2)*H(1) H为自逆矩阵
return (Q, R)
生成的Q为正交矩阵
matlab中生成随机正交矩阵
判断矩阵是否正交:
输出为+1或-1
print(np.linalg.det(rot_matrix))
1.3 正交阵单位化
#生成单位正交阵
def norm_Q(Q):
norms = np.linalg.norm(Q, axis=1)
return Q/norms
使用 Python 中的 numpy.linalg.norm() 方法对矩阵进行归一化
生成随机单位对角阵(综合上面代码):
#1.生成随机稀疏对称单位正交阵
def sparse_matrix(m,n,density):
A = sprandsym(m,n,density) #生成随机稀疏矩阵
Q = householder_reflection(A) #进行QR分解生成的Q为正交阵
Q_norm = norm_Q(Q) #将正交阵单位化
return Q_norm
2. 生成对角线元素大于0的矩阵
numpy产生一个大于0的随机数_Python基础(四)–numpy包(基本函数)
#2.生成对角元素大于0的对角阵
def diag_positive(matrixSize):
np.random.seed(1)
return np.diag(np.random.random(matrixSize))
3. 生成稀疏对称正定矩阵
C = A * B * A
python生成稀疏对称正定矩阵
#coding:utf8
import time
import numpy as np
import scipy.stats as stats
import scipy.sparse as sparse
#生成的 Q为正交阵
def householder_reflection(A):
"""Householder变换"""
(r, c) = np.shape(A)
Q = np.identity(r)
R = np.copy(A)
for cnt in range(r - 1):
x = R[cnt:, cnt]
e = np.zeros_like(x)
e[0] = np.linalg.norm(x)
u = x - e
v = u / np.linalg.norm(u)
Q_cnt = np.identity(r)
Q_cnt[cnt:, cnt:] -= 2.0 * np.outer(v, v)
R = np.dot(Q_cnt, R) # R=H(n-1)*...*H(2)*H(1)*A
Q = np.dot(Q, Q_cnt) # Q=H(n-1)*...*H(2)*H(1) H为自逆矩阵
return Q
# 生成随机稀疏矩阵
def sprandsym(m,n,density):
rvs = stats.norm().rvs #从正太分布中生成随机数
X = sparse.random(m,n, density=density, data_rvs=rvs) #生成随机稀疏矩阵
#A = X.todense()
upper_X = sparse.triu(X)
result = upper_X + upper_X.T - sparse.diags(X.diagonal())
result = result.todense()
return result
def sprandsym_b(m,n,density):
rvs = stats.norm().rvs #从正太分布中生成随机数
X = sparse.random(m,n, density=density, data_rvs=rvs) #生成随机稀疏矩阵
A = X.todense()
return A
#生成单位正交阵
def norm_Q(Q):
norms = np.linalg.norm(Q, axis=1)
return Q/norms
#1.生成随机稀疏对称单位正交阵
def sparse_matrix(m,n,density):
A = sprandsym(m,n,density) #生成随机稀疏矩阵
Q = householder_reflection(A) #进行QR分解生成的Q为正交阵
Q_norm = norm_Q(Q) #将正交阵单位化
return Q_norm
#2.生成对角元素大于0的对角阵
def diag_positive(matrixSize):
np.random.seed(1)
return np.diag(np.random.random(matrixSize))
#3.C=A*B*A 得到的C为稀疏对称正定矩阵
matrixSize = 1000
density = 0.4
np.set_printoptions(precision=4, suppress=True)
A = sparse_matrix(matrixSize,matrixSize,density)
B = diag_positive(matrixSize)
C = A * B * A
参考文章:
矩阵的QR分解(三种方法)Python实现
matlab中生成随机正交矩阵
如何生成随机的对称正定矩阵?
matlab中sprandsym,Python:如何使用Python生成随机稀疏对称矩阵…