如何将3D C#数组作为可导入的.mat文件转换为3D Matlab数组?

时间:2018-07-26 19:26:36

标签: c# .net matlab multidimensional-array matio

我有一个3D双数组double[,,] surfaceData = new double[5, 304, 304];,然后用嵌套的for循环填充。它在C#中效果很好,但是如何将其转换为.mat Matlab可读文件?

我正在使用csmatio。我可以用它输出.mat文件:

List<MLArray> mlList = new List<MLArray>();
mlList.Add(mlDouble);
MatFileWriter mfw = new MatFileWriter("SurfaceDataTest.mat", mlList, false);

......,其中mlDouble是csmatio中的MLDouble对象。这没问题。当我无法直接引用三个索引时(例如,mlDouble),问题就蔓延到mlDouble[4,3,60]。相反,usage guidlines建议我像这样填充3D数组...

screenshot of guide

我已经尝试了许多嵌套的for循环,但尚未找到解决方案。

这是一个凌乱的例子:

for(int i = 0; i < 304; i++) 
{
    for(int j = 0; j < 304; j++) 
    {
        for(int k = 0; k < 5; k++) 
        {
            mlDouble.Set(surfaceData[k, j, i], i, j * k);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

万一这对任何人都有帮助,我发现使用MatFileHandler代替csmatio更容易。

在MatFileHandler中,只需定义一个DataBuilder

DataBuilder builder = new DataBuilder();

使用字符串名称和C#对象定义MatLab变量:

var matVar = builder.NewVariable("<VariableNameForML>", csharpvar);

创建要添加的变量列表,即使仅添加一个变量也是如此:

List<IVariable> matList = new List<IVariable>();
matList.Add(matVar);

然后:

var matFile = builder.NewFile(matList);

using (var fileStream = new FileStream("SurfaceData.mat", FileMode.Create))
{
    var writer = new MatFileWriter(fileStream);
    writer.Write(matFile);
}

希望这可以帮助与我处于同一职位的任何人:)