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

How can I convert a 3D C# array to a 3D Matlab array as an importable .mat file?

我有一个 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[4,3,60] )时,问题是填充 mlDouble 。相反,usage guidlines 建议我像这样填充 3D 数组...

我已经尝试了很多嵌套的 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);
        }
    }
}

如果这对任何人有帮助,我发现使用 MatFileHandlercsmatio 更容易。

在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);
}

希望这对和我处境相同的人有所帮助:)