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为已打开的可读文件指针;M、N、nz分别用于存储矩阵的行数、列数、非零元数。
功能:在使用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为已打开的可读文件指针;M、N分别用于存储矩阵或向量的行数、列数。
功能:在使用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为已打开的可写文件指针;M、N、nz分别为存储矩阵的行数、列数、非零元数。
功能:在使用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为已打开的可写文件指针;M、N为存储矩阵或向量的行数、列数。
功能:在使用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格式存储的稀疏矩阵数据以及它们的特性和图像,可以根据矩阵规模、矩阵类型选择理想的矩阵数据进行实验。
网友评论