【原创】开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

               本博客所有文章分类的总目录:【总目录】本博客博文总目录-实时更新 

开源Math.NET基础数学类库使用总目录:【目录】开源Math.NET基础数学类库使用总目录

前言

  本人在09年使用该组件的时候,主要原因也是为了替代Matlab,进行相关数学计算,现在依然有很多人关注Matlab计算,特别是学生,而很多也在使用C#,所以这些人通常由于个人能力有限(无法精通某一个门语言来解决综合问题),无法单纯的通过C#或者Matlab来解决问题,就想通过混合编程来调用完成,其实本人也做过大量的Matlab.NET混合编程研究,而且也个人制作了一套视频教程,编写过很多文章,可以参考如下文章:

1.国内第一部Matlab和C#.Net混合编程入门级视频教程【完全免费】

2.Matlab.NET混合编程调用Figure窗体

3.Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码) 

4.Matlab.NET混合编程技巧之——找出Matlab内置函数 

5.Matlab与.NET基于类型安全的接口混合编程入门

6.Matlab与.NET混合编程解决人脸识别问题 

  鉴于此,我也提醒过很多人,在.NET中可以使用Math.NET组件来替代Matlab的相关工作,可能效果不太好。今天就来介绍一个比较适用的功能,利用Math.NET提供的功能,使用C#来读写Matlab的mat数据格式,这个功能的使用场景也很广泛,当然可能是研究偏多,大家思想可以放得更远。

  如果本文资源或者显示有问题,请参考 本文原文地址http://www.cnblogs.com/asxinyu/p/4265972.html

1.Mat数据格式

  用过一段matlab的人都知道,在matlab的工作空间中,可以将变量保存为mat数据格式,下次在程序中直接读取和进行计算,非常方便。以前也没有具体研究过这个格式,也趁这个写博客的机会,一起来看看这个东西的作用和组成。虽然使用Math.NET提供的程序读取和写入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类,解析的功能函数就是下面这段代码:

  View Code

  C#调用就更简单了,上面那些实现只是一个帮助,大家以后可以了解解析其他类似的数据格式。看看调用的代码:

复制代码
 1 using MathNet.Numerics.LinearAlgebra;
 2 using MathNet.Numerics.Data.Matlab;
 3 
 4 //从collection.mat文件中,读取第一个double矩阵
 5 Matrix<double> m = MatlabReader.Read<double>("collection.mat");
 6 
 7 //从collection.mat中读取一个名称为 vd 的特定矩阵
 8 Matrix<double> m = MatlabReader.Read<double>("collection.mat", "vd");
 9 
10 //直接选择转换为其他格式
11 Matrix<Complex> m = MatlabReader.Read<Complex>("collection.mat");
12 
13 //将一个文件的所有矩阵及其名称存入字典中
14 Dictionary<string,Matrix<double>> ms = MatlabReader.ReadAll<double>("collection.mat");
15 
16 //读取名为 Ad和vd 的矩阵到字典
17 var ms = MatlabReader.ReadAll<double>("collection.mat", "vd", "Ad");
复制代码

  这样就可以直接在C#中进行相关计算了,也不用混合编程那么麻烦了。

4.C#保存Mat数据格式

  Mat数据格式的写入主要用MatlabWriter类,核心功能函数就是下面代码:

  View Code

  C#调用也很简单,调用的代码如下:  

复制代码
 1 var matrices = new List<MatlabMatrix>();
 2 m.Add(MatlabWriter.Pack(myFirstMatrix, "m1");
 3 m.Add(MatlabWriter.Pack(mySecondMatrix, "m2");
 4 MatlabWrier.Store("file.mat", matrices);
 5 
 6 //写入单个的"myMatrix"矩阵,并命名为"m1".
 7 MatlabWriter.Write("file.mat", myMatrix, "m1");
 8 
 9 //写入多个矩阵,注意 矩阵列表 和 名称列表
10 MatlabWriter.Write("file.mat", new[] { m1, m2 }, new[] { "m1", "m2" });
11 
12 //写入字典矩阵,和读取的原理类似
13 var dict = new Dictionary<string, Matrix<double>>();
14 dict.Add("m1", m1);
15 dict.Add("m2", m2);
16 MatlabWriter.Write("file.mat", dict);
复制代码

5.资源

  接下来的文章将继续介绍Math.NET的其他功能。 




本文转自数据之巅博客园博客,原文链接:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_MathNet_Parse_Mat_Formate_3.html,如需转载请自行联系原作者

相关文章
|
12天前
|
C#
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
|
17天前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
33 7
C# 9.0 新特性解析
|
12天前
|
开发框架 C# iOS开发
基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform
基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform
|
12天前
|
消息中间件 监控 数据可视化
基于.NET开源、功能强大且灵活的工作流引擎框架
基于.NET开源、功能强大且灵活的工作流引擎框架
|
12天前
|
JavaScript 前端开发 API
精选5个.NET开源且免费的通用权限管理系统
精选5个.NET开源且免费的通用权限管理系统
|
16天前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
28 2
|
1月前
|
关系型数据库 C# 数据库
.NET 8.0 开源在线考试系统(支持移动端)
【10月更文挑战第27天】以下是适用于 .NET 8.0 的开源在线考试系统(支持移动端)的简介: 1. **基于 .NET Core**:跨平台,支持多种数据库,前后端分离,适用于多操作系统。 2. **结合 Blazor**:使用 C# 开发 Web 应用,支持响应式设计,优化移动端体验。 3. **基于 .NET MAUI**:跨平台移动应用开发,一套代码多平台运行,提高开发效率。 开发时需关注界面设计、安全性与稳定性。
|
12天前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架
|
12天前
|
机器学习/深度学习 文字识别 并行计算
一款.NET开源的屏幕实时翻译工具
一款.NET开源的屏幕实时翻译工具
|
12天前
|
开发框架 安全 .NET
.NET使用Moq开源模拟库简化单元测试
.NET使用Moq开源模拟库简化单元测试~
下一篇
无影云桌面