matlab取出矩阵某行某列_<读书笔记3> 稀疏矩阵数据结构

44db382e36227a4bd85df4cb934bd3ef.png

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

Chapter 2 Basic algorithms

2.1 Sparse matrix data structures

稀疏矩阵的数据结构,常用的是三元组表示法,包括了COO,CSR,CSC等。其中每种表示法,也分为了基0(

),或者基1(
)的,表示首元素是从0开始还是从1开始。对于MATLAB user,采用基1的。但是在MATLAB内部以及CSparse,以及其他基础算法软件中,大部分均采用基0。在本书中,这两种方式均有采用,要依据上下文进行判断:
  • C code:全部基0;
  • MATLAB:全部基1;
  • 伪代码:基于0;
  • 书中的图graph示例以及矩阵示例:基于1。

此处举例:

  1. COO的基0的表达为:
int i[]    = {2,     1,   3,   0,   1,   3,   3,   1,   0,   2}; // entry 的行index 
int j[]    = {2,     0,   3,   2,   1,   0,   1,   3,   0,   1}; // entry 的列index
double x[] = {3.0, 3.1, 1.0, 3.2, 2.9, 3.5, 0.4, 0.9, 4.5, 1.7}; // entry 的值

COO比较容易创建,但是比较难用于实际的算法中。

2. CSC的基0的表达为:

int ptr[]    = {0,               3,             6,        8,    10}; // 每列首非零entry的索引 
int idx[]    = {0,     1,   3,   1,   2,   3,   0,   2,   1,   3};   // 非零entry的行索引
double x[]   = {4.5, 3.1, 3.5, 2.9, 1.7, 0.4, 3.2, 3.0, 0.9, 1.0};   // entry 的值

CSC格式更加有用,在CSparse中被广泛采用。如果想要取出第j列的全部的值,则对应的x数组的索引为ptr[j]->ptr[j+1]-1,即x[ptr[j]]->x[ptr[j+1]-1],这些值所对应的行号i为i[p[j]]到i[ptr[j+1]-1]。所以在实际算法中,采用CSC格式,利于对列元素组成的向量进行运算。

3. CSR的基0的表达为:

int ptr[]    = {0,          2,             5,        7,         10}; // 每行首非零entry的索引 
int idx[]    = {0,     2,   0,   1,   3,   1,   2,   0,   1,   3};   // 非零entry的列索引
double x[]   = {4.5, 3.2, 3.1, 2.9, 0.9, 1.7, 3.0, 3.5, 0.4, 1.0};   // entry 的值

同CSC格式类似,采用CSR格式,有利于对行元素组成的向量进行运算。所以在实际算法中,有可能需要对同一个稀疏矩阵,同时采用CSC和CSR进行表达。

在CSparse中,采用的数据结构为:

typedef struct cs_sparse
{
    /* matrix in compressed-column or triplet form */
    int nzmax; /* maximum number of entries */
    int m ;    /* number of rows */
    int n ;    /* number of columns */
    int *p ;   /* column pointers (size n+l) or col indices (size nzmax) */
    int *i ;   /* row indices, size nzmax */
    double *x; /* numerical values, size nzmax */
    int nz;    /* # of entries in triplet matrix, -1 for compressed-col */
} cs;

对于COO以及CSC格式都是利用上述结构体,利用nz区别所采用的格式。在CSparse中,大部分函数仅支持一种数据格式,除了cs_print, cs_spalloc,cs_spfree, cs_sprealloc,这些格式都支持。

mexFunction in C or Fortran:

  • mxGetJc:return A->p
  • mxGetlr: return A->i
  • mxGetPr:return A->x
  • mxGetM:return A->m
  • mxGetN: return A->n
  • mxGetNzmax:return A->nzmax

上述的数据格式,是同样也可以用来表示矩阵A中的特定位置的零元素。是由于在后续的算法中,会对矩阵进行符号分析,会预估矩阵中的非零元素位置,但是这些元素在未被计算出来之前,是由0进行赋值的。

由于在已经确定的数据结构中增加或者删减一个entry,需要耗时

,所以更倾向于在计算之前,已经预先构建好数据结构,在后面的算法中,会有非常多这方面的体会。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值