C#解析matlab的mat格式
(2015-08-05 21:35:50)
标签:
变量矩阵数据格式c |
分类: 人工智能 |
1.Mat数据格式
Mat文件格式,实际上使用的是一种通用的数值数据存储格式Hierarchical Data
Format(HDF),该格式最先是由美国国家超级计算应用中心开发的,后来由HDF非盈利组织资助,进行不但完善和推广。这个格式的使用是非常广泛的(使用BSD许可证),例如一些大名鼎鼎的商业和非商业软件LabVIEW,MATLAB,Scilab,Octave,Mathematica等都支持该格式,该格式目前主要有HDF4和HDF5。
Mat文件格式最新的7.3版是基于HDF5的。
有关HDF文件格式和Mat格式的资料如下:
wikipedia:http://en.wikipedia.org/wiki/Hierarchical_Data_Format
Matlab官方:http://cn.mathworks.com/help/matlab/import_export/mat-file-versions.html
HDF官方:http://www.hdfgroup.org/
Mat文件格式分为2个等级(目前我知道的) Level 4和
Level 5。Level 4 Mat文件格式支持只支持2维矩阵和字符串;而Level
5支持更多,如多维数组,字符串数组,Cell数组,稀疏矩阵,对象,结构等都支持。本文介绍的MathNet.Numerics.Data.Matlab是直接支持Level-5类型的,所有更强大。
2.Mat格式在Matlab中的使用
Matlab中mat数据的保存和读取非常简单,只需要使用Save和load命令即可。对Matlab熟悉的朋友可以随便打开matlab敲几个命令就可以了,由于电脑太慢,前段时间把Matlab卸载了,这里就只介绍mat格式读取和保存的语法,实际的使用也是比较简单的。
http://www.ilovematlab.cn/thread-78257-1-1.html
●save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为
matlab.mat,MAT文件可以通过load函数再次导入工作区,MAT函数可以被不同的机器导入,甚至可以通过其他的程序调用。
●save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。
●save('filename', 'var1', 'var2', ...):保存指定的变量在 filename
指定的文件中。
●save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。
●save('filename', '-struct', 's', 'f1', 'f2',
...):保存结构体s中的指定变量。
● save('-regexp', expr1, expr2,
...):通过正则表达式指定待保存的变量需满足的条件。
● save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。
MATLAB中导入数据通常由函数load实现,该函数的用法如下:
●load:如果matlab.mat文件存在,导入matlab.mat中的所有变量,如果不存在,则返回error。
●load filename:将filename中的全部变量导入到工作区中。
●load filename X Y Z
...:将filename中的变量X、Y、Z等导入到工作区中,如果是MAT文件,在指定变量时可以使用通配符“*”。
●load filename -regexp expr1 expr2 ...:通过正则表达式指定需要导入的变量。
●load -ascii
filename:无论输入文件名是否包含有扩展名,将其以ASCII格式导入;如果指定的文件不是数字文本,则返回error。
●load -mat
filename:无论输入文件名是否包含有扩展名,将其以mat格式导入;如果指定的文件不是MAT文件,则返回error。
3.C#读取Mat数据格式
Math.NET中有关Mat数据格式读写的组件是MathNet.Numerics.Data.Matlab,Mat数据格式的读取主要用
MatlabReader类,解析的功能函数就是下面这段代码:
/// Extracts all matrix blocks in a
format we support from a stream.
internal static List
ParseFile(Stream stream)
{
}
C#调用就更简单了,上面那些实现只是一个帮助,大家以后可以了解解析其他类似的数据格式。看看调用的代码:
using
MathNet.Numerics.LinearAlgebra;
using
MathNet.Numerics.Data.Matlab;
//从collection.mat文件中,读取第一个double矩阵
Matrix m =
MatlabReader.Read("collection.mat");
//从collection.mat中读取一个名称为 vd
的特定矩阵
Matrix m =
MatlabReader.Read("collection.mat", "vd");
//直接选择转换为其他格式
Matrix m =
MatlabReader.Read("collection.mat");
//将一个文件的所有矩阵及其名称存入字典中
Dictionary>
ms = MatlabReader.ReadAll("collection.mat");
//读取名为 Ad和vd
的矩阵到字典
var ms =
MatlabReader.ReadAll("collection.mat", "vd",
"Ad");
这样就可以直接在C#中进行相关计算了,也不用混合编程那么麻烦了。
4.C#保存Mat数据格式
Mat数据格式的写入主要用MatlabWriter
类,核心功能函数就是下面代码:
/// Writes all matrix blocks to a
stream.
internal static void
FormatFile(Stream stream, IEnumerable matrices)
{
}
C#调用也很简单,调用的代码如下:
var matrices = new
List();
m.Add(MatlabWriter.Pack(myFirstMatrix,
"m1");
m.Add(MatlabWriter.Pack(mySecondMatrix,
"m2");
MatlabWrier.Store("file.mat",
matrices);
//写入单个的"myMatrix"矩阵,并命名为"m1".
MatlabWriter.Write("file.mat",
myMatrix, "m1");
//写入多个矩阵,注意 矩阵列表
和名称列表
MatlabWriter.Write("file.mat",
new[] { m1, m2 }, new[] { "m1", "m2" });
//写入字典矩阵,和读取的原理类似
var dict = new
Dictionary>();
dict.Add("m1",
m1);
dict.Add("m2",
m2);
MatlabWriter.Write("file.mat",
dict);
后一篇:2015年08月05日