QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 753|回复: 0
打印 上一主题 下一主题

稀疏矩阵简介

[复制链接]
字体大小: 正常 放大
回帖奖励 1 点体力 回复本帖可获得 1 点体力奖励! 每人限 1 次

413

主题

36

听众

1854

积分

升级  85.4%

  • TA的每日心情
    开心
    2019-9-18 21:55
  • 签到天数: 258 天

    [LV.8]以坛为家I

    社区QQ达人

    群组2015国赛冲刺

    群组2016美赛公益课程

    群组国赛讨论

    群组第三届数模基础实训

    群组Matlab讨论组

    跳转到指定楼层
    1#
    发表于 2015-9-26 22:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    稀疏矩阵
    我们要学习三种数据类型:稀疏矩阵,单元阵列和结构。稀疏矩阵是矩阵的一种特殊形式,在这个矩阵中只对非零元素分配内存。单元阵列也是一种矩阵,它的每一个元素可以是MATLAB任何一种数据类型。
    它们广泛应用于MATLAB用户图象界面(GUI)函数。最后,结构提供了一种在单个变量中存储了不同类型的数据的方法,在这个变量中的每一个数据项目都有一个独立的名字。
    稀疏矩阵
    我们已经学过了普通的MATLAB数组。当一个普通的数组被声明后,MATLAB将会为每一个数组元素分配内存。例如函数a = eye(10)要创建了100个元素,按10×10的结构分配,对角线上的元素均为1,其余的元素为0。注意这些数组其中的90个元素为0。这个包含有一百个元素的矩阵,只有10个元素包含非零值。这是稀疏矩阵或稀疏数组的一个例子。稀疏矩阵是指一个很大的矩阵,且大多数的元素为0。
    >> a=2*eye(10)
    a =
         2     0    0     0     0    0     0     0    0     0
         0     2    0     0     0    0     0     0    0     0
         0     0    2     0     0    0     0     0    0     0
         0     0    0     2     0    0     0     0    0     0
         0     0    0     0     2    0     0     0    0     0
         0     0    0     0     0    2     0    0     0     0
         0     0    0     0     0    0     2     0    0     0
         0     0    0     0     0    0     0     2    0     0
         0     0    0     0     0    0     0     0    2     0
         0     0    0     0     0    0     0     0     0    2
    现在假如我们要创建一个10×10的矩阵,定义如下
    b =
         1     0    0     0     0    0     0     0    0     0
         0     2    0     0     0    0     0     0    0     0
         0     0    2     0     0    0     0     0    0     0
         0     0    0     1     0     0    0     0     0    0
         0     0    0     0     5    0     0     0    0     0
         0     0    0     0     0    1     0     0    0     0
         0     0    0     0     0    0     1     0    0     0
         0     0    0     0     0    0     0     1    0     0
         0     0    0     0     0    0     0     0    1     0
         0     0    0     0     0    0     0     0    0     1
    若a,b两矩阵相乘得到的结果为
    >> c = a * b
    c =
         2     0    0     0     0    0     0     0    0     0
         0     4    0     0     0    0     0     0    0     0
         0     0    4     0     0    0     0     0    0     0
         0     0    0     2     0    0     0    0     0     0
         0     0    0     0    10    0     0     0    0     0
         0     0    0     0     0    2     0     0    0     0
         0     0    0     0     0    0     2     0    0     0
         0     0    0     0     0    0     0     2    0     0
         0     0    0     0     0    0     0     0    2     0
         0     0    0     0     0    0     0     0    0     2
    这两个稀疏矩阵相乘需要1900次相加和相乘,但是在大多数时侯相加和相乘的结果为0,所以我们做了许多的无用功。这个问题会随着矩阵大小的增大而变得非常的严重。例如,假设我们要产生两个200×200的稀疏矩阵,如下所示
    a = 5 * eye(200);
    b = 3 * eye(200);
    每一个矩阵有20000个元素,其中19800个元素是0。进一步说,对这两个矩阵相乘需要7980000次加法和乘法。
    我们可以看出对大规模稀疏矩阵进行存储和运算(其中大部分为0)是对内存空间和cpu资源的极大浪费。不巧的是,在现实中的许多问题都需要稀疏矩阵,我们需要一些有效的方示来解决这个问题。
    大规模供电系统是现实世界中涉及到稀疏矩阵一个极好的例子。大规模供电系统可以包括上千条或更多的母线,用来产生,传输,分配电能到子电站。如果我们想知道这个系统的电压,电流和功率,我们必须首先知道每一条母线的电压。如果这个系统含有一千个母线,这就要用到含有1000个未知数的联立方程组,包括一个方程,也就是说我们要创建含有1000000个元素的矩阵。解出这个矩阵,需要上百万次的浮点运算。
    但是,在这个系统中,一条母线平均只它的三条母线相连,而在这个矩阵中每一行其他的996个元素将为0,所以在这个矩阵的加法和乘法运算中将会产生0。如果在求解的过程中这些0可以忽略,那么这个电力系统的电压和电流计算将变得简单而高效。


    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    数学中国版主团队!
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-5-21 07:11 , Processed in 0.417051 second(s), 51 queries .

    回顶部