将复杂向量保存和读取为二进制文件

Saving and Reading complex vectors as binary files

提问人:Qasdew 提问时间:11/11/2023 更新时间:11/11/2023 访问量:58

问:

我有一个随机生成的 MATLAB 大小为 N 的复向量(单向量,而不是双倍量),格式如下:

vec = [-3.2621543 + 2.7376063i, -1.2618964 - 1.0076348i, ....]

我将其保存为MATLAB中的.bin文件,如下所示:

filPath = 'test.bin';
vecReal = real(vec);
vecImag = imag(vec);
rWrite = reshape([vecReal; vecImag], 1, []);

fid = fopen(filPath, 'w');      
fwrite(fid, rWrite,'float');    
fclose(fid);

所以我在向量上调用以下格式的 fwrite:

rWrite = [-3.2621543, 2.7376063, ....]

我想将 test.bin C++ 读取为 std::vector<complex>我这样做的代码是:

int vectorSize = N; // The same N variable in MATLAB

std::vector<complex<float>> dataVector(vectorSize);

inputFile.read(reinterpret_cast<char*>(dataVector.data()), sizeof(float) * vectorSize);

inputFile.close();

但是我在 dataVector 中获得的值甚至不接近生成的 MATLAB 向量, 我得到以下值:

数据向量 = [-0.951752782 + 1.05218506i, -3.02577972 + 1.09116054i, ...]

我做错了什么?

我尝试读取一个二进制文件,其中包含以下格式的浮点变量的复杂向量:

a = [真实,图像,真实,图像,...]

但是在C++中阅读后我得到了不同的值。

C++ MATLAB 二进制文件

评论

0赞 Retired Ninja 11/11/2023
我建议编写一个包含您知道的 matlab 和 c++ 中 1.0、2.0 位模式的值的单个项目,并使用十六进制编辑器检查两者以查看它们如何匹配。我猜您将无法直接在 c++ 中将文件读入 a,您可能需要单独读取每个浮点数,然后从中构造最终值。complex<float>
1赞 Retired Ninja 11/11/2023
如果在 Windows 上执行此操作,请确保以二进制模式打开文件,以避免行尾转换和 EOF 问题。
0赞 Cris Luengo 11/11/2023
在 MATLAB 代码中,确保使用行向量,而不是列向量。你能在MATLAB中正确读回数据吗?vec
0赞 heap underrun 11/11/2023
MATLAB 是否有方便的方法将数据保存到 JSON 文件中?然后,在C++端,您可以使用nlohmann json等库来读取JSON文件。
0赞 Cris Luengo 11/11/2023
演示如何在 C++ 中打开文件。我是一般的,一个最小的可重复的例子是理想的,因为那时我们确切地知道发生的一切,我们不需要问问题。

答: 暂无答案