我在[[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 ++中的内存映射方式匹配)我仍然在寻找更多无需编写尺寸向量的常规代码(其中有时会改变)谢谢。
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
。
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