C# 读取mat文件(csmatio.dll的使用)

  近期项目需求,需要实现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);

            #endregion

4、创建三维矩阵

            #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)             
             */
            #endregion

5、创建四维矩阵

            #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);
            #endregion

6、读取二维矩阵

            #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];
            }
            #endregion

7、读取三维矩阵

            #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);
            }
            #endregion

8、读取四维矩阵

            #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]);

                            }
                        }
                    }
                }
            }
            #endregion

9、读取或创建struct数据,参考https://sourceforge.net/p/csmatio/wiki/Usage%20Examples/


版权声明:本文为theadore2017原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。