Matrix Marker稀疏矩阵文件存储格式

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容