【数值分析+python】python生成稀疏对称正定矩阵

思路

如何生成随机对称正定矩阵?

  1. 随机生成一个单位正交阵A
  2. 随机生成一个对角元素均大于0的对角矩阵B(这个更容易了,就是生成几个随机正数而已)
  3. C = A ∗ B ∗ A C=A*B*A C=ABA即为一个正定矩阵,同时也是一个对称矩阵。

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))

python 判断矩阵是否正交

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生成随机稀疏对称矩阵…

扫描二维码关注公众号,回复: 14834346 查看本文章

猜你喜欢

转载自blog.csdn.net/m0_52427832/article/details/127133347