gpt4 book ai didi

C++ |如何格式化和导出由二维矩阵组成的简单二进制文件

转载 作者:太空狗 更新时间:2023-10-29 23:04:16 24 4
gpt4 key购买 nike

我需要将可以具有各种尺寸(100x10、1000000x4、100000x100)的非常大的矩阵导出到格式化的二进制文件中,该文件将包含如何划分列的信息。然后将该文件加载到 Matlab 中以获得一些绘图结果。

直到现在,我在我创建的类的一个函数中使用简单的 ASCII 导出,如下所示(在别处定义的文件构造函数):

void file_io::writeColData(vector< vector<double> >* data){
for(unsigned int i = 0;i < (*data).size();i++){
for(unsigned int j = 0;j < (*data)[i].size();j++){
file << (*data)[i][j] << '\t';
}
file << '\n';
}
}

它打印了一个完整格式的漂亮文件,该文件作为 load(file.txt); 简单地加载到 Matlab 中。一切正常,矩阵被保留,只是它慢得令人难以置信和痛苦。

我唯一设法在二进制中工作的是一个简单 vector 的导出:

void file_io::writeColDataBin(vector<double>* data){
for(unsigned int i = 0;i < (*data).size();i++){
file.write(reinterpret_cast<const char*>(&(*data)[i]), sizeof((*data)[i]));
}
}

我可以将另一个维度应用于上面的 void 函数,但是我无法设置输出格式 - 我得到的只是一长列数据(我需要更多这些列,数量取决于情况)。

我知道我可以包含一些 Matlab 库(我使用的是 Eclipse IDE),但我认为这对我的需求来说太过分了,更不用说我在几次之后无法让它工作的事实痛苦的时光。我知道的另一个库是 MAT IO (matio.h),但我也无法让它工作。

导出后,我需要将其导入到 Matlab 中,可能是通过

fid = ('data.dat','r','l');
data = fopen(fid,'double');

(希望)显示我需要的矩阵。

有没有办法做到这一点?一种真正...简单、简单的方法?

提前致谢!

最佳答案

到目前为止,您对数组数据二进制输出的尝试看起来还不错。但是,您还需要在数据之前写入数组维度(行、列)。然后,假设这些数字被写成例如作为C++中的uint64_t,你可以在matlab中读取文件如下:

function matrix = load_2d(filename, data_type)

fid = fopen(filename, 'rb');
rows = fread(fid, 1, 'uint64');
cols = fread(fid, 1, 'uint64');
matrix = fread(fid, [rows cols], data_type);
fclose(fid);

end

其中 data_typematlab data type 的字符串表示形式对应于您在 C++ 中的数据类型。

由于您用 vectorvector 表示您的矩阵(每个内部 vector 包含一列),这仅在所有情况下有效内部 vector 大小相同。否则,您需要单独写入每列的大小(行)并相应地调整 load_2d。但如果目标是单个二维矩阵,则必须以某种方式进行截断。

同理,回存:

function save_2d(filename, matrix, data_type)

fid = fopen(filename, 'wb');
[rows, cols] = size(matrix);
fwrite(fid, rows, 'uint64');
fwrite(fid, cols, 'uint64');
fwrite(fid, matrix, data_type);
fclose(fid);

end

虽然我还没有测试过。

关于C++ |如何格式化和导出由二维矩阵组成的简单二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23164730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com