如何在Matlab中保存多维矩阵的二进制并将其加载为C ++结构?

问题描述 投票:2回答:1

我在[[Matlab中有一个多维矩阵,我将其保存为二进制文件,如下所示:

mat = reshape(1:90, 9,5,2); fileName = 'mat.bin'; fid = fopen(fileName, 'w'); fwrite(fid, mat, 'int32'); fclose(fid);

C ++

中,我像这样加载它:struct Mat { int32_t arr[9][5][2]; }; std:ifstream input("mat.bin"); Mat* m = new Mat(); input.read(reinterpret_cast<char*>(m), sizeof(Mat)); input.close();
问题是加载的数据在内存中的排列方式不同例如:

访问arr[1][1][1]将产生Matlab的索引数组mat(5,2,1)的值

(当然要考虑Matlab的索引从1开始)

在将矩阵(和任何其他多维矩阵)写入二进制文件之前,如何以arr[i][j][k]mat(i+1, j+1, k+1)相同的方式排列矩阵?

编辑:

当前解决方案对于二维情况,矩阵转置可解决该问题。

对于x-D,我发现我可以像这样改变向量的顺序permute(mat, [D D-1 D-2 ... 1])就像传播向量一样(这与C ++中的内存映射方式匹配)我仍然在寻找更多无需编写尺寸向量的常规代码(其中有时会改变)

谢谢。

c++ arrays matlab bin
1个回答
0
投票
从MATLAB保存之前,您可以使用matC = permute(mat, ndims(mat):-1:1)

permute(mat, ndims(mat):-1:1),在您的示例中将尺寸从(9,5,2)更改为(2,5,9)。

基本上是您的解决方案,但将permute(mat, [D D-1 D-2 ... 1])替换为ndims(mat):-1:1


MATLAB代码示例:

mat = ones(9,5,2); % Fill some data for testing: mat(:, :, 1) = meshgrid(1:5, 1:9); mat(:, :, 2) = meshgrid(101:105, 101:109); matC = permute(mat, ndims(mat):-1:1); fileName = 'mat.bin'; fid = fopen(fileName, 'w'); fwrite(fid, matC, 'int32'); fclose(fid);


C ++代码示例:

#include <stdint.h> #include <iostream> #include <fstream> int main() { struct Mat { int32_t arr[9][5][2]; }; std::ifstream input("mat.bin", std::ios_base::binary); Mat* m = new Mat(); input.read(reinterpret_cast<char*>(m), sizeof(Mat)); input.close(); delete m; return 0; }

测试样本:在C ++中:m->arr[3][4][1] = 105在MATLAB中:mat(4,5,2) = 105
© www.soinside.com 2019 - 2024. All rights reserved.