▶ 图片参考【http://www.bu.edu/pasi/files/2011/01/NathanBell1-10-1000.pdf】

▶ 各种系数矩阵的数据结构

● MAT,原始矩阵数据

 typedef struct          // 顺序格式
{
int row; // 行数
int col; // 列数
int count; // 非零元个数(用于转换,不用于计算)
format *data; // 元素的值
}
MAT;

●  Compressed Sparse Row(CSR),由非零值向量,各元素列号向量,各行首元在列号向量中的起始位置向量组成

 typedef struct
{
int row; // 行数
int col; // 列数
format *data; // 非零元的值
int *index; // 非零元的列号
int *ptr; // 每行首元在 index 中的下标,最后一个元素的值等于矩阵非零元个数
}
CSR;

● Compressed Sparse Column Format (CSC),类似 CSR,不过是列优先存储,实现暂时没写,留坑

 typedef struct
{
int row; // 行数
int col; // 列数
format *data; // 非零元的值
int *index; // 非零元的行号
int *ptr; // 每列首元在 index 中的下标,最后一个元素的值等于矩阵非零元个数
}
CSC;

●  ELLPACK(ELL),记录非零元的列号,然后把非零元素压缩到最左边。为了提高内存读取,我的 ELL 相当于将图中的两个矩阵进行了转置

 typedef struct
{
int row; // 行数,等于 MAT 格式非零元最多行的非零元个数
int col; // 列数,等于 MAT 格式的行数
int colOrigin; // 原列数,等于 MAT 格式的列数
format *data; // 非零元的值
int *index; // 元素在原矩阵中的列号
}
ELL;

●  Coordinate(COO),用行列坐标来记录每个非零元的位置

 typedef struct
{
int row; // 行数
int col; // 列数
int count; // 非零元个数
int *rowIndex; // 行向量
int *colIndex; // 列向量
format *data; // 元素的值
}
COO;

● Diagonal(DIA),相当于将矩阵的主对角线捋成一列,其他元素水平移动,然后砍掉所有元素均为零的列(即原矩阵中所有元素均为零的对角线),变换后矩阵行数不变,列数可能增大或减小

 typedef struct
{
int row; // 行数
int col; // 列数
int colOrigin; // 原列数
format *data; // 元素的值
int *index; // 原矩阵各对角线是否非零
}
DIA;

● Hybrid (HYB) ELL + COO,相当于先尽量 ELL,右边多出的部分砍下来用 COO 单独保存。实现暂时没写,留坑

● Skyline Matrix Storage Format,参考【https://software.intel.com/en-us/mkl-developer-reference-c-sparse-blas-skyline-matrix-storage-format】。实现暂时没写,留坑

■ 例如,下三角中,value 按行优先保存了主对角线及其左下部的元素,每行开头的零略掉但中间的零不省略,ptr 记录每行第一个非零元在 value 中的下标;上三角类似,但是按列优先排列元素。

● Block Sparse Row(BSR),参考【https://software.intel.com/en-us/mkl-developer-reference-c-sparse-blas-bsr-matrix-storage-format】,那个 4 向量的版本没太理解,3 向量的版本参考【http://www.cs.colostate.edu/~mcrob/toolbox/c+/sparse_matrix_compression.html】看懂了。实现暂时没写,留坑

■ 3 向量版本中,value 表示分块小矩阵的值,呈行优先排列,小矩阵元素展开成一维时内部要列优先排列(这里超出了 Mathtype 的最大宽度,所以没有展开),col_index 表示每个小矩阵起始列号,row_ptr 表示每行首个非零小矩阵在 col_index 中的下标

稀疏矩阵 part 1的更多相关文章

  1. [LeetCode] Sparse Matrix Multiplication 稀疏矩阵相乘

    Given two sparse matrices A and B, return the result of AB. You may assume that A's column number is ...

  2. 转载:稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB

    http://www.cnblogs.com/xbinworld/p/4273506.html 稀疏矩阵是指矩阵中的元素大部分是0的矩阵,事实上,实际问题中大规模矩阵基本上都是稀疏矩阵,很多稀疏度在9 ...

  3. poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化

    题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...

  4. 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB

    稀疏矩阵是指矩阵中的元素大部分是0的矩阵,事实上,实际问题中大规模矩阵基本上都是稀疏矩阵,很多稀疏度在90%甚至99%以上.因此我们需要有高效的稀疏矩阵存储格式.本文总结几种典型的格式:COO,CSR ...

  5. C语言 稀疏矩阵 压缩 实现

    稀疏矩阵压缩存储的C语言实现 (GCC编译). /** * @brief C语言 稀疏矩阵 压缩 实现 * @author wid * @date 2013-11-04 * * @note 若代码存在 ...

  6. 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)

    三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...

  7. 稀疏矩阵乘法加法等的java实现

    原创声明:本文系作者原创,转载请写明出处. 一.前言       前几天由于科研需要,一直在搞矩阵的稀疏表示的乘法,不过最近虽然把程序写出来了,还是无法处理大规模的矩阵(虽然已经是稀疏了).原因可能是 ...

  8. Matlab稀疏矩阵

    一.矩阵存储方式 MATLAB的矩阵有两种存储方式,完全存储方式和稀疏存储方式 1.完全存储方式 将矩阵的全部元素按列存储,矩阵中的全部零元素也存储到矩阵中. 2.稀疏存储方式 仅存储矩阵所有的非零元 ...

  9. matlab——sparse函数和full函数(稀疏矩阵和非稀疏矩阵转换)

    函数功能:生成稀疏矩阵 使用方法 :S = sparse(A) 将矩阵A转化为稀疏矩阵形式,即矩阵A中任何0元素被去除,非零元素及其下标组成矩阵S.如果A本身是稀疏的,sparse(S)返回S. S ...

  10. 稀疏矩阵coo_matrix的乘法

    稀疏矩阵的乘法在做基于n-gram的分类的时候还是相当有用的,但是由于网上资料太少,所以折腾了几天才算折腾出来. 首先scipy包里常见的稀疏矩阵有三种形式, coo_matrix, csr_matr ...

随机推荐

  1. 我的代码- rf sampling

    # coding: utf-8 # In[6]: import pandas as pdimport numpy as npfrom sklearn import treefrom sklearn.s ...

  2. tornado--启动

    tornado--启动 from tornado import web from tornado import ioloop from tornado.httpserver import HTTPSe ...

  3. About cookie

    1.cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据. 2.session其实指的就是访问者从到达某个特定主页到离开为止的那段时间. ...

  4. vim中制表符tabstop用法

    设置tabstop成为其它值可能会导致文件在其它地方出现错误有四种主要方法使用tabs在vim里: 1.总是保持tabstop=8,设置softtabstop=4.shiftwidth=4(或3.或任 ...

  5. hsdf -- 6.21 -- day6

    差点忘写总结…… 这么快就到day6了啊 感觉前面写的总结都是苟屁,跟没有有什么区别…… 今天认真总结一下 最大的失误就是全程肝a题,最后还挂了…… 感觉今天方向偏了,由进行一次测试到仅仅是想要尽可能 ...

  6. MySQL和MySQL的注释方式

    MySQL的注释方式   mysql 服务器支持如下几种注释方式: (1) # 到该行结束     # 这个注释直到该行结束 mysql> SELECT 1+1; (2)-- 到该行结束     ...

  7. 面向对象编程导论 An Introduction to Object-Oriented Programming (Timothy 著)

    第1章 面向对象思想 第2章 抽象 第3章 面向对象设计 第4章 类和方法 第5章 消息,实例和初始化 第6章 案例研究: 八皇后问题 第7章 研究研究: 台球游戏 第8章 继承与替换 第9章 案例研 ...

  8. 命令生成所有数据库表模型以及 CRUD

    将下列代码写到文件复制到项目 console\controller 目录下: <?php namespace console\controllers; use Yii; use yii\cons ...

  9. Python(五) —— 内置模块

    文档参考:https://docs.python.org/zh-cn/3.7/library/index.html 随机模块——random 这里我们介绍几种常用 random 的操作   名称 功能 ...

  10. Django学习笔记之数据库-模型的操作

    模型的操作 在ORM框架中,所有模型相关的操作,比如添加/删除等.其实都是映射到数据库中一条数据的操作.因此模型操作也就是数据库表中数据的操作. 添加模型 添加模型到数据库中.首先需要创建一个模型.创 ...