本篇为稀疏矩阵求解算法经典论著<Direct Methods for Sparse Linear System>的<读书笔记 4>

Chapter 2 Basic algorithms

上一篇主要介绍了稀疏矩阵的数据结构,那么在接下来本章主要包括了其几个基础的算法。

  1. Matrix-vector multiplication

对于矩阵-向量乘法操作

,其中
是稠密向量,
为稀疏矩阵。

其伪代码为

这个伪代码是基于CSC格式的,第一层for循环实际上是以x向量展开的。以CSR格式进行计算更容易理解。

C代码为:

int 

2.3 Utilities

此部分主要是一些用于内存空间处理的应用函数。不展开介绍,比较简单。这里的函数仅仅是创建了内存空间,但是没有存储空间中没有实际内容。

函数 用途
void *cs_malloc (int n, size_t size) 内存分配
void *cs_calloc (int n, size_t size) 内存分配并清零
void *cs_free (void *p) 清楚分配空间
void *cs_realloc (void *p, int n, size_t size, int *ok) 改变一块存储空间p的size
cs *cs_spalloc (int m, int n, int nzmax, int values, int triplet) 创建m*n稀疏矩阵,用于保存nzmax个entries,参数triplet用于设定是COO还是CSC格式
int cs_spfree (cs *A, int nzmax) 释放创建的稀疏矩阵空间
int cs_sprealloc (cs *A, int nzmax) 依据nzmax,重新对稀疏矩阵A分配空间

2.4 Triplet form

一般情况下,需要从文件中或许原始稀疏矩阵数据,常用的数据文件,例如mtx文件等,采用的是COO(或者在本书中称 Triplet form)。程序需要读入此类文件,获取数据,然后再得到这个数据的CSC,或者CSR格式。

如下面的代码,首先将COO格式的数据,存放再Ti,Tj,Tx中,然后再转成CSC格式的数据,得到对应的p,以及i。如果存在具有相同行和列索引的多个entries,则对应的数值是所有这些重复entries的和。

cs 

函数 用途
int cs_entry (cs *T, int i, int j, double x) 将aij=x的数据存入到T中
cs *cs_compress (const cs *T) 将COO转变为CSC格式
cs *cs_done (cs *C, void *w, void *x, int ok) 释放w和x的内存空间
double cs_cumsum (int *p, int *c, int n) 计算累加和

2.5 Transpose

稀疏矩阵的转置,与稠密矩阵不同,更像是将矩阵的从CSC格式转变为CSR格式的转换。

函数 用途
cs *cs_transpose (const cs *A, int values) 稀疏矩阵A的转置

2.6 Summing up duplicate entries

有限元素方法生成的矩阵是元素(elements)的集合或密集的子矩阵。完备矩阵是元素(elements)的总和。如果两个元素构成同一个条目,则应该对它们的值进行求和。

函数 用途
int cs_dupl (cs *A) 对重复elements求和

2.7 Removing entries from a matrix

CSparse并不要求它的稀疏矩阵不包含数值上的零项,但它的MATLAB接口要做到这一点。cs_fkeep函数使用了一个函数指针fkeep (i ,j ,aij , other)作为参数,fkeep 用于评估A中的每一个entry。如果fkeep是true,则此entry保持。

函数 用途
int cs_fkeep (cs *A, int (*fkeep) (int, int, double, void *), void *other) 移除零entry
static int cs_nonzero (int i, int j, double aij, void *other) 判断entry非零
int cs_dropzeros (cs *A) 移除零

2.8 Matrix multiplication

在CSparse中,采用CSC格式,矩阵乘

,其中
,A为
,B为
,取A和B的列,每次计算出C的列。
,
,
分别代表矩阵
的列向量,则有
。将A分解为k列,将
分解为k个独立的entries。

矩阵C的非零特征由以下的定理得到:

定理2.1:

的非零特征是
的非零特征的并集,其中
需要满足
为非零。如果
表示,
的非零entries的行索引集合,则有

矩阵乘法均需要计算

以及
函数 用途
int cs_scatter (const cs *A, int j, double beta, int *w, double *x, int mark, cs *C, int nz) 对于给定的j,实现上述两个公式
cs *cs_multiply (const cs *A, const cs *B) 计算稀疏矩阵乘法C=AB

稀疏矩阵乘法的计算量为

,其中
为浮点运算性能。

2.9 Matrix addition

矩阵加

等价于
。所以函数

cs_add实际上看起来很像cs_multiply。

函数 用途
cs *cs_add (const cs *A, const cs *B, double alpha, double beta) 计算C=alpha A+beta B

2.10 Vector permutation

置换矩阵P实际上也是一个稀疏矩阵,它的每一行和列均有只有一个非零元素并且为1。所以置换矩阵P可以用一个稀疏矩阵P来表示。或者用一个长度为n的整型向量p来表示,p即称为置换向量,其中p[k]=i,意味着

。矩阵P是正交的,所以
。同样,置换矩阵的逆被定义为

pinv[i]=k,如果

函数 用途
int cs_pvec (const int *p, const double *b, double *x, int n) 计算x=Pb
int cs_ipvec (const int *p, const double *b, double *x, int n) 计算x=PTb
int *cs_pinv (int const *p, int n) 计算p的逆

2.11 Matrix permutation

函数cs_permute用于计算矩阵的置换,

(在MATLAB中为C=A(p,q))。其中,长度为n的向量q为列转置向量,长度为m的

pinv(不是p)为行转置向量,其中A为m*n。如果pinv[i]=k,则A的第i行变为C的第k行;同理,A的第j列通过q进行置换。

函数cs_symperm用于对称矩阵的置换。如果一个对称矩阵,仅保存了上三角矩阵或者下三角元素,则利用cs_cs_permute则会使得到C不是一个对称矩阵,所以需要cs_symperm实现此功能,并且返回值C是与A同样的三角矩阵形式。

函数 用途
cs *cs_permute (const cs *A, const int *pinv, const int *q, int values) 计算一般矩阵的置换矩阵
cs *cs_symperm (const cs *A, const int *pinv, int values) 计算对称矩阵的置换矩阵

2.12 Matrix norm

矩阵范数:

  • 1-范数:

    ,是最容易计算的,利用

    cs_norm函数得到。

  • 2-范数:A的最大奇异值,稀疏矩阵的2-范数并不重要,此处没有给计算函数。
  • ∞-范数:最大的行的和。
函数 用途
double cs_norm (const cs *A) 计算稀疏矩阵的1-范数

c++矩阵转置_lt;读书笔记4gt; 稀疏矩阵基础算法相关推荐

  1. 【《Redis深度历险》读书笔记(1)】基础:万丈高楼平地起 ——Redis 5种基础数据结构

    [时间]2021.11.16 [题目][<Redis深度历险>读书笔记(1)]基础:万丈高楼平地起 --Redis 基础数据结构 本栏目是<Redis深度历险:核心原理和应用实践&g ...

  2. c++矩阵转置_C语言:数据结构-稀疏矩阵的压缩存储

    (1)稀疏矩阵的特点 在一个m×n的矩阵中,设矩阵中有i个元素不为零,并令△=i/(m×n),称△为稀疏因子.通常当△≤0.05时.认为该矩阵为稀疏矩阵. 对这类矩阵实现压缩存储的基本思路是只需要存储 ...

  3. 读书笔记(python)--图及其算法

    限于笔者技术水平,文章可能存在错漏,请各位不吝赐教,笔者会尽快改正 文章目录 前言 一.图的术语与实现 二.宽度优先(BFS)与深度优先(DFS) 1.一个简单的图 2.BFS代码 3.DFS代码 4 ...

  4. 【读书笔记】Java基础学习之目录

    前述 :本人目前正在学习java,开发Android应用,因此重新来把java学习一遍. 本文所有资料来源于互联网,我将根据自己的学习进度,不断的将资料整合,就当作是读书笔记吧! 本文作为目录页,将不 ...

  5. 【读书笔记】语言基础- Lua语言入门(一)

    目录 注:本系列为<Lua程序设计-第4版> 的读书笔记,其中的见解有不完善的地方,可以在评论区指出,原版请看图书 Lua运行环境 一. 使用Lua语言解释器运行Lua语言:(下面的实例以 ...

  6. 读书笔记|指数型函数对算法的影响实际应用-day3

    14天阅读挑战赛 系列文章目录 趣味算法(第二版)读书笔记: day1: 序章|学习的方法和目标. day2:算法之美|打开算法之门与算法复杂性 day3.算法之美|指数型函数对算法的影响实际应用 d ...

  7. 【读书笔记】《漫画算法》:克服对算法的恐惧,从漫画开始

    写在开头 在上小学和初高中的时候,要我写读后感这种东西,我是非常厌恶的.无非就是老师布置的一个作业,还是那种无趣且磨人的工作. 结果十多年过去了,到了工作的年纪,看书反倒是自觉地写起读后感来了,而且居 ...

  8. 机器学习实战读书笔记(一)机器学习基础

    http://sourceforge.net/projects/numpy/files/ 下载对应版本的numpy,到处下不到,找到一个没python2.7 用pip吧, pip install nu ...

  9. 读书笔记(06) - 语法基础 - JavaScript高级程序设计

    写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...

最新文章

  1. JavaSE(十八)——IO流之字符流
  2. wxWidgets:wxMouseEvent类用法
  3. 数据库-null值处理及元数据
  4. 如何编写自己的Java / Scala调试器
  5. Papar Notes List
  6. Dirichlet Process和Hierarchical Dirichlet Process的理解(PPT)
  7. Tunnelling HTTP Traffic Through XSS Channels.pdf
  8. Mysql 存储过程基本语法
  9. java自动行走_java数据结构实现机器人行走
  10. ST电机库 MCSDK-FUL_5.4.4 下载
  11. 安装基于Ubuntu的微信小程序开发工具
  12. CYCADA: cycle-consistent adversaial domain adaption阅读笔记
  13. 美团红包变成了3元红包的原因
  14. 凯悦旗下中高端酒店品牌逸扉在上海亮相
  15. 5 个 GitHub 项目拿下 Linux
  16. 自己动手做聊天机器人 一-涉及知识
  17. 未定义错误c语言中英文,C语言编程出错英汉提示对照表
  18. 基于jsp和servlet的蛋糕店售卖网站商城系统javaweb点心铺源码mysql
  19. 前端构建工具-gulp !(解决浏览器缓存问题)
  20. .Net学习——委托

热门文章

  1. Metal入门教程(二)三维变换
  2. Windows 7 HomeGroup的隐私保护
  3. DSO(dsoframer)的接口文档
  4. LeetCode - Combinations
  5. C++测试题练习题1
  6. 关于NSString和NSMutableString的retainCount
  7. oracle 10g rman catalog数据库版本问题
  8. Js中Date的应用
  9. 网管实战之使用RSA实现企业安全访问
  10. 写给即将入行以及刚入行的程序员,你需要注意的几个点,别忽略!