当前位置: 首页 > news >正文

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

文章目录

  • 思路
  • 1.生成一个随机稀疏单位正交阵
    • 1.1生成稀疏矩阵
    • 1.2 生成稀疏对称矩阵
    • 1.3 生成正交阵
    • 1.3 正交阵单位化
  • 2. 生成对角线元素大于0的矩阵
  • 3. 生成稀疏对称正定矩阵
  • 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生成随机稀疏对称矩阵…

相关文章:

  • jave web开发(IDEA中配置maven)
  • 保存滚动位置的实现方法
  • 什么是数据库事务
  • 异步FIFO的原理及verilog实现(循环队列、读写域数据同步、Gray Code、空满标志、读写域元素计数)
  • 大数据_YARN的工作原理
  • anaconda,docker和Jupyter Notebook常见问题解答
  • 【Rust日报】2022-10-01 Rumqtt:基于rust的mqtt代理
  • STM32 GPIO模拟UART串口:外部时钟及TIM方式
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • 知识点17--如何将spring boot项目布置在外部tomcat中
  • 面向对象——抽象类
  • C++ 异常处理机制讲解
  • 【软考 - 高级系统架构设计师】考前冲刺计划 及 国庆作息时间
  • Typescript的数组类型
  • 【分治法】第k个数(快速选择算法,结合快速排序)
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • Android Studio:GIT提交项目到远程仓库
  • JavaScript DOM 10 - 滚动
  • javascript 总结(常用工具类的封装)
  • React-flux杂记
  • Web Storage相关
  • 包装类对象
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 关于使用markdown的方法(引自CSDN教程)
  • 近期前端发展计划
  • 如何使用 JavaScript 解析 URL
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 数据仓库的几种建模方法
  • 微信小程序开发问题汇总
  • 线性表及其算法(java实现)
  • 新版博客前端前瞻
  • 异常机制详解
  • 在Mac OS X上安装 Ruby运行环境
  • C# - 为值类型重定义相等性
  • ​什么是bug?bug的源头在哪里?
  • (23)Linux的软硬连接
  • (C++20) consteval立即函数
  • (Git) gitignore基础使用
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET delegate 委托 、 Event 事件,接口回调
  • .Net Memory Profiler的使用举例
  • .NET MVC第三章、三种传值方式
  • .Net Web项目创建比较不错的参考文章
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net分布式压力测试工具(Beetle.DT)
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @EnableWebMvc介绍和使用详细demo