近期项目需求,需要实现C#对mat文件的读取,网上有通过math.net实现对mat文件的读取,测试了一番,发现对三维、四维数据的读取会报错,如图。

纠结一番未找到原因,也不是mat文件格式的原因(level4 格式只支持一维二维数据,level5 格式支持多维及struct格式数据),对mat文件格式感兴趣可参考链接:https://wenku.baidu.com/view/5e2cb1bf7c1cfad6185fa708.html?from=search
下面换一种方式调用mat文件:
1、所需库文件:csmatio.dll(如何安装就不介绍了)
下载地址:https://www.nuget.org/packages/csmatio/
2、项目中添加引用
using System;
using csmatio.io;
using csmatio.types;3、创建二维矩阵
#region 创建二维矩阵
double[][] data3x3 = new double[3][];
data3x3[0] = new double[] { 100.0, 101.0, 102.0 }; // first row
data3x3[1] = new double[] { 200.0, 201.0, 202.0 }; // second row
data3x3[2] = new double[] { 300.0, 301.0, 302.0 }; // third row
MLDouble mlDoubleArray = new MLDouble("Matrix_3_by_3", data3x3); //创建matlab 二维矩阵变量
List<MLArray> mlList = new List<MLArray>();
mlList.Add(mlDoubleArray);
MatFileWriter mfw = new MatFileWriter("data.mat", mlList, false);
#endregion4、创建三维矩阵
#region 创建三维矩阵
初始化三维矩阵,设置维度
int[] dims = new int[] { 2, 2, 2 };
MLDouble array3Dim = new MLDouble("cube", dims);
array3Dim.Set(1, 0, 0);
array3Dim.Set(2, 1, 0);
array3Dim.Set(3, 0, 1);
array3Dim.Set(4, 1, 1);
array3Dim.Set(5, 0, 2);
array3Dim.Set(6, 1, 2);
array3Dim.Set(7, 0, 3);
array3Dim.Set(8, 1, 3);
List<MLArray> mlList = new List<MLArray>();
mlList.Add(array3Dim);
MatFileWriter mfw = new MatFileWriter("data2.mat", mlList, false);
/*
A: Once you created the 3D array, then use: array.Set(value, row_ind, col_index).
For example, your 3D array is m*n*3:
for 1st dimension, use array.Set(value, row_ind, col_index);
for 2nd dimension, use array.Set(value, row_ind, col_index+n);
for 3rd dimension, use array.Set(value, row_ind, col_index+2n)
*/
#endregion5、创建四维矩阵
#region 创建四维矩阵
// 初始化四维矩阵,设置维度
int[] dims = new int[] { 5, 4, 3, 2 };
MLDouble array4Dim = new MLDouble("cube4", dims);
int value = 1;
for (int i = 0; i < dims[3]; i++)
{
for (int j = 0; j < dims[2]; j++)
{
for (int p = 0; p < dims[1]; p++)
{
for (int q = 0; q < dims[0]; q++)
{
array4Dim.Set(value++, q, p + j * dims[1] + i * dims[2] * dims[1]);
}
}
}
}
List<MLArray> mlList = new List<MLArray>();
mlList.Add(array4Dim);
MatFileWriter mfw = new MatFileWriter("data2.mat", mlList, false);
#endregion6、读取二维矩阵
#region 读取二维数据
// create a reader for the file
MatFileReader mfr = new MatFileReader("test22.mat");
// get a reference to our matlab 'squares' double matrix
MLSingle mlSquares = (mfr.Content["w1"] as MLSingle);
Single[] squares;
if (mlSquares != null)
{
// now get the double values
Single[][] tmp = mlSquares.GetArray();
squares = tmp[0];
}
#endregion7、读取三维矩阵
#region 读取三维数据
// create a reader for the file
MatFileReader mfr = new MatFileReader("cube.mat");
// get a reference to our matlab 'cube' double matrix
MLDouble mlCube = (mfr.Content["cube"] as MLDouble);
if (mlCube != null)
{
// calculate the index of our element
int idx = 0;//按列递增
// now get the double value
double value = mlCube.Get(idx);
}
#endregion8、读取四维矩阵
#region 读取四维数据
// create a reader for the file
MatFileReader mfr = new MatFileReader("test22.mat");
//读取四维矩阵
MLSingle mlCube = (mfr.Content["kernel_3"] as MLSingle);
int[] dims = mlCube.Dimensions;
Single[,,,] s = new Single[dims[0], dims[1], dims[2], dims[3]];
if (mlCube != null)
{
for (int i = 0; i < dims[3]; i++)
{
for (int j = 0; j < dims[2]; j++)
{
for (int p = 0; p < dims[1]; p++)
{
for (int q = 0; q < dims[0]; q++)
{
s[q, p, j, i] = mlCube.Get(q + dims[0] * p + j * dims[1] * dims[0] + i * dims[2] * dims[1] * dims[0]);
}
}
}
}
}
#endregion9、读取或创建struct数据,参考https://sourceforge.net/p/csmatio/wiki/Usage%20Examples/
版权声明:本文为theadore2017原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。