1. Matrix Market简介

Matrix Market是美国国家标准与技术研究所信息技术实验室的数学和计算科学部门的一项服务。

提供了在数值线性代数算法的比较研究中使用的测试数据的一个可视化存储库,具有来自各种应用的近500个稀疏矩阵,以及矩阵生成工具和服务。

2. Matrix Market交换格式

2.1 定义

Matrix Market(MM)交换格式提供了一个简单的机制来促进矩阵数据的交换。

具体来说,定义一个了最小的基本ASCII文件格式,它可以很容易地解释和解析,但可以很容易地适应具有更严格结构的应用程序,或扩展到相关的数据对象。矩阵的MM交换格式实际上是共享设计元素的附属格式的集合。在其最初的规范中,定义了以下两种矩阵格式:

1.坐标格式(COO):

适用于稀疏矩阵的存储,只以坐标(行号,列号,非零元值)的形式存储矩阵中的非零元元素,即假设稀疏矩阵第一行第五列的元素为7,则记录下“1 5 7”来表示这个元素。

2.数组格式:

用于存储稠密矩阵和稠密向量,存储矩阵中所有的元素的值(默认按列存储)。

2.2 支持的矩阵类型

支持数据类型:实数real、复数complex、整数integer、二进制pattern;

支持矩阵结构:通用general(正常存储所有非零元)、对称symmetry(只存储下三角)、斜对称skew-symmetric(下三角不包括对角线,因为对角线元素为0)、Hermitian(下三角)。

2.3 MM格式存储方式

MM格式使用“.mtx”的ASCII文本文件存储矩阵数据,其第一行对存储的矩阵类型和存储格式进行了说明,例如:

%%MatrixMarket matrix coordinate real symmetric

其中给出了所存储的矩阵数据是COO格式的,其数据类型为实数,并且它是一个对称矩阵,因此可以得到,该文件内存储了一个实对称矩阵下三角部分数据的坐标和值。

%”开头为文件头,包含了矩阵的信息,之后第一行会给出矩阵的“行数、列数、非零元数”(如果为数据格式则只有行数和列数),在这之后才是矩阵数据。

2.4 MMIO C接口

在C语言中,对于存储在文本内的数据,能够很简单的用fscanf()fprintf()进行处理。唯一的问题是需要弄清楚“.mtx”文件中存储的矩阵类型,Matrix Market提供的实用工具只识别和管理“.mtx”文件中的类型和大小信息,使用者可以通过MMIO工具得到文件中存储的矩阵类型,然后自己编写相应的应用程序来存储数据。

2.4.1 mm_read_banner()

函数定义:int mm_read_banner(FILE *f, MM_typecode *t);

参数:f为已打开的可读文件指针;t指向一个结构体包含矩阵的特征,可以通过查询函数“MM_IS”来获取特征。

功能:从“.mtx”文件第一行获取矩阵信息(存储格式、数据类型、矩阵结构)。

返回值:

0--执行成功;

MM_PREMATURE_EOF--存在部分特征没有出现在文件的第一行;

MM_NO_HEADER--文件不以"%%MatrixMarket"开头;

MM_UNSUPPORTED_TYPE--无法识别描述。

2.4.2 mm_read_mtx_crd_size()

函数定义:int mm_read_mtx_crd_size(FILE *f, int *M, int *N, int *nz);

参数:f为已打开的可读文件指针;MNnz分别用于存储矩阵的行数、列数、非零元数。

功能:在使用mm_read_banner()读取文件头后,使用该函数从“.mtx”文件中读取COO格式存储的稀疏矩阵的大小信息(行数、列数、非零元数)。

返回值:

0--执行成功;

MM_PREMATURE_EOF--在获取信息之前就到达了文件末尾(end-of-file)。

2.4.3 mm_read_mtx_array_size()

函数定义:int mm_read_mtx_array_size(FILE *f, int *M, int *N);

参数:f为已打开的可读文件指针;MN分别用于存储矩阵或向量的行数、列数。

功能:在使用mm_read_banner()读取文件头后,使用该函数从“.mtx”文件中读取数组格式存储的稠密矩阵或向量的大小信息(行数、列数)。

返回值:

0--执行成功;

MM_PREMATURE_EOF--在获取信息之前就到达了文件末尾(end-of-file)。

2.4.4 mm_write_banner()

函数定义:int mm_write_banner(FILE *f, MM_typecode *t);

参数:f为已打开的可写文件指针;t指向一个结构体包含矩阵的特征,可以通过分配函数“MM_SET”来设置特征。

功能:在“.mtx”文件第一行写入以"%%MatrixMarket"开头的矩阵信息(存储格式、数据类型、矩阵结构)。

返回值:

0--执行成功;

MM_COULD_NOT_OPEN_WRITE_FILE--执行失败。

2.4.5 mm_write_mtx_crd_size()

函数定义:int mm_write_mtx_crd_size(FILE *f, int M, int N, int nz);

参数:f为已打开的可写文件指针;MNnz分别为存储矩阵的行数、列数、非零元数。

功能:在使用mm_write_banner()写入文件头后,使用该函数往“.mtx”文件中写入COO格式存储的稀疏矩阵的大小信息(行数、列数、非零元数)。

返回值:

0--执行成功;

MM_COULD_NOT_OPEN_WRITE_FILE--执行失败。

2.4.6 mm_write_mtx_array_size()

函数定义:int mm_write_mtx_array_size(FILE *f, int M, int N);

参数:f为已打开的可写文件指针;MN为存储矩阵或向量的行数、列数。

功能:在使用mm_write_banner()写入文件头后,使用该函数往“.mtx”文件中写入数组格式存储的稠密矩阵或向量的大小信息(行数、列数)。

返回值:

0--执行成功;

MM_COULD_NOT_OPEN_WRITE_FILE--执行失败。

2.4.7 MM_IS

函数定义:

int mm_is_matrix(MM_typecode t);

int mm_is_sparse(MM_typecode t);

int mm_is_coordinate(MM_typecode t);

int mm_is_dense(MM_typecode t);

int mm_is_array(MM_typecode t);

int mm_is_complex(MM_typecode t);

int mm_is_real(MM_typecode t);

int mm_is_pattern(MM_typecode t);

int mm_is_integer(MM_typecode t);

int mm_is_symmetric(MM_typecode t);

int mm_is_general(MM_typecode t);

int mm_is_skew(MM_typecode t);

int mm_is_hermitian(MM_typecode t);

参数:t存储了矩阵的特征。

功能:提供类型查询功能,用于获取MM_typecode结构体中记录的矩阵特征(COO存储或数组存储、数据类型、矩阵结构)。

返回值:

1--真,即矩阵符合该特征;

0--假,矩阵不符合该特征。

2.4.8 MM_SET

函数定义:

int mm_set_matrix(MM_typecode &t);

int mm_set_sparse(MM_typecode &t);

int mm_set_coordinate(MM_typecode &t);

int mm_set_dense(MM_typecode &t);

int mm_set_array(MM_typecode &t);

int mm_set_complex(MM_typecode &t);

int mm_set_real(MM_typecode &t);

int mm_set_pattern(MM_typecode &t);

int mm_set_integer(MM_typecode &t);

int mm_set_symmetric(MM_typecode &t);

int mm_set_general(MM_typecode &t);

int mm_set_skew(MM_typecode &t);

int mm_set_hermitian(MM_typecode &t);

int mm_clear_typecode(MM_typecode &t);

int mm_initialize_typecode(MM_typecode &t);

参数:t用于存储矩阵的特征。

功能:提供类型设置功能,用于设置MM_typecode结构体中将要记录的矩阵特征(COO存储或数组存储、数据类型、矩阵结构)。

mm_write_banner()后使用,并且需要先使mm_initialize_typecode用来初始化结构体。

返回值:空。

2.4.9 mm_typecode_to_str()

函数定义:char *mm_typecode_to_str(MM_typecode t);

参数:t存储了矩阵的特征。

功能:将类型描述符转化为字符串,可以用于打印错误信息。

返回值:

字符串--执行成功,返回的为转化得到的字符串;

NULL--发生错误。

2.5 读取数据

一般提取矩阵数据用于计算的话只需要根据文件第一行确认矩阵的类型,然后直接获取矩阵的行数、列数(非零元数),根据它们分配内存用于存储数据,然后逐行读取文件得到数据。Matrix Market提供了不同的软件代码包,包含一些常用的方法用于读取MM格式的数据,可在官网中找到,一些数值计算的开源软件也是根据它们提供的代码来实现相关操作的。

2.5.1 读取Matrix Market文件可以分为三个基本步骤:

1. 使用mm_read_banner()处理文件的第一行并识别矩阵类型;

2. 使用特定类型的函数,例如mm_read_mtx_crd_size()来跳过可选注释并处理矩阵规模信息;

3. 使用fscanf()来读取数据,每行对应矩阵的一个元素。

2.5.2 将内部数据结构中的矩阵保存到Matrix Market文件的类似步骤:

1. 使用mm_write_banner()创建矩阵市场文件的第一行;

2. (可选)添加以“%”分隔的注释;

3. 使用特定类型的函数,例如mm_write_mtx_crd_size()来记录矩阵规模信息;

4. 使用fprintf()的变体来写入数字数据,每行对应矩阵的一个元素。

3. SuiteSparse Matrix Collection稀疏矩阵数据集

SuiteSparse Matrix Collection(原佛罗里达大学稀疏矩阵数据集)是从广泛的应用程序中收集的一组广泛使用的稀疏矩阵基准。

其中提供了大量的MM格式存储的稀疏矩阵数据以及它们的特性和图像,可以根据矩阵规模、矩阵类型选择理想的矩阵数据进行实验。

参考:

1. Matrix Market

2. SuiteSparse Matrix Collection

作者:大疯疯疯子
链接:https://www.jianshu.com/p/4d2a95ce3055
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Matrix Marker稀疏矩阵文件存储格式相关推荐

  1. 稀疏矩阵的存储格式(Sparse Matrix Storage Formats)

    稀疏矩阵的存储格式(Sparse Matrix Storage Formats) Sason@CSDN 对于很多元素为零的稀疏矩阵,仅存储非零元素可使矩阵操作效率更高.现有许多种稀疏矩阵的存储方式,但 ...

  2. linux怎么看文件是否orc格式,hive文件存储格式orc,parquet,avro对比

    orc文件存储格式 ORC文件也是以二进制方式列式存储的,所以是不可以直接读取,ORC文件也是自解析的,它包含许多的元数据,这些元数据都是同构ProtoBuffer进行序列化的.文件结构如下 ORC文 ...

  3. (转载)hive文件存储格式

    对于hive格式的认识,先转载后实践再加深认识. 转载地址:http://blog.csdn.net/yfkiss/article/details/7787742 hive在建表是,可以通过'STOR ...

  4. sqlserver exec查询存储过程取某一个字段_ORC文件存储格式的深入探究

    因为生病,另外还在做牙齿的根管治疗,痛不欲生,短更一篇. 年前都在梳理<大数据成神之路>的目录还有内容,另外Flink的公开课程也在规划大纲和目录.不知道我在说什么,看一下这里<20 ...

  5. 大数据:Parquet文件存储格式

    一.Parquet的组成 Parquet仅仅是一种存储格式,它是语言.平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎 ...

  6. hive-02-hive文件存储格式

    1.概述 hive在建表是,可以通过'STORED AS FILE_FORMAT' 指定存储文件格式 例如: > CREATE EXTERNAL TABLE MYTEST(num INT, na ...

  7. Hive文件存储格式和hive数据压缩

    一.存储格式行存储和列存储 二.Hive文件存储格式 三.创建语句和压缩 一.存储格式行存储和列存储 行存储可以理解为一条记录存储一行,通过条件能够查询一整行数据. 列存储,以字段聚集存储,可以理解为 ...

  8. 大数据:Hive - ORC 文件存储格式

    一.ORC File文件结构 ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache ...

  9. RC ORC Parquet之大数据文件存储格式的一哥之争

    背 景   大数据如火如荼的发展中,以hadoop集群为基础的数据存储和计算框架也日新月异的精进,而如何减少存储空间又提升计算效率,一直是大数据集群老生常谈的问题,今天就一起聊聊最基本的大数据文件存储 ...

最新文章

  1. 20155321 实验四 Android程序设计
  2. C#基础总结之四List-Hashtable-冒泡排序
  3. 如何将读书与自己的生活工作结合起来?
  4. 用图表说话 麦肯锡 pdf下载_揭秘麦肯锡顾问百万年薪背后的逻辑,麦肯锡「方法论」系列大合集...
  5. matlab hsi图像分割,提取图像的HSI图像分量
  6. xtrabackup部署以及使用
  7. github上下载别人的vue项目,本地运行
  8. adb 黑域app_黑域使用教程 进入黑域app详细教程
  9. 趣挨踢 | 只有挨踢人才能读懂的西游记
  10. 【优化算法】简述灰狼优化算法(GWO)原理
  11. 记一次小白调参baseline——NLP中文预训练模型泛化能力比赛
  12. Jetson TX2 之 JetPack 3.0 安装小记
  13. linux C/C++ 后端服务问题排查(gdb, pstack,valgrind)
  14. K均值聚类算法(HCM,K-Means)
  15. Java-互联网通信流程介绍【基础】
  16. python爬取58上的招聘信息
  17. java异或-实现字符串找不同
  18. CCF-CSP-202112-2:序列查询新解(C++11题解)
  19. Linux下安装SVN服务端小白教程
  20. 百度地图导入kml、kmz文件自动纠偏预览版本

热门文章

  1. Lambda表达式的几种使用方式
  2. 游戏运营小白到总监!
  3. 三分钟详述如何实现像素风格Shader
  4. js,jQuery,js-EasyU大总结
  5. 《能断金刚》46个商业问题解决之法
  6. mysql-power()求次方,sqrt()开根号
  7. git: does not have a commit checked out
  8. Android打开系统自带文件管理器,选择指定类型的文件
  9. 下载Gazebo模型库
  10. 什么?java也能弹钢琴?