如何将 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);
}
}
}
如果这对任何人有帮助,我发现使用 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);
}
希望这对和我处境相同的人有所帮助:)
我有一个 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);
}
}
}
如果这对任何人有帮助,我发现使用 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);
}
希望这对和我处境相同的人有所帮助:)