序列化浮点数向量
Serialize a vector of floats
问题是我想在文件中保存一个2D float向量。由于我不熟悉c++,这变得很麻烦,可能的解决方法是:
- 将它们序列化成字符串并写入文件
- 将它们序列化为二进制数据并写入文件。
两种方法中哪一种在速度方面更有效?
我正在做这样的事情:
std::string serialized;
for (int s = 0; s < (int) mfcc_features_a.size(); s++)
{
for (int t = 0; t < (int) mfcc_features_a[s].size(); t++){
serialized = serialized + "|" + boost::lexical_cast<std::string>(mfcc_features_a[s][t]);
}
}
std::cout << "serialized string is: " << serialized << std::endl;
存储二进制数据可能会更快一些,因为数据几乎肯定会更小。对于程序的整体性能而言,这种差异可能很重要,也可能不重要:您必须进行测量才能发现。
在c++ 03中,你的代码有一个主要的低效率。specialized = specialized + "|" + ...
逐渐创建越来越长的完整数据副本,每个float值三个副本。要么使用+=
,要么直接将数据写入流。在c++ 11中,你可以这样写specialized = std::move(specialized) + "|" + ...
虽然二进制的执行速度肯定更快,但它在编码和调试时可能会很麻烦,因为大多数程序员都不太理解浮点格式。在这方面,编程和执行的总时间可能会更慢。
而且,如果希望将数据移植到任何其他机器上,几乎可以肯定,将数据转换为通用可读格式是值得的。
虽然不是很像c++,但我喜欢使用sprintf
例程将浮点值格式化为固定宽度字符串(24个字符)。
char *pData = new char[vec.size() * 24 + 1];
char *p = pData;
for (size_t i = 0; i < vec.size(); ++i, p += 24)
sprintf(p, "%+.14Ern", vec(i));
// ... write pData to file ...
delete[] pData;
祝你好运!
相关文章:
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何对向量进行排序<浮点数,字符串>而不考虑字符串
- C++ 按数值对元组<字符串、浮点数>然后按字典顺序排序的向量
- 将浮点数向量转换为十六进制/二进制字符串
- 浮点数组作为 Eigen::Vector3f 的向量
- 在张量流C++中将浮点数的向量传递给张量
- 将字节向量转换为浮点数向量
- 获取 c++ 中浮点数向量的向量的逐元素平均值
- 如何将 4 个浮点数的 ps 向量转换为 4 个双精度并存储到 pd 数组
- 如何拆分 QString 并将一部分字符串保存在浮点数的向量中
- 如何使用 avx 指令将浮点数向量转换为短整型?
- 什么是最大内存可以分配给浮点数的 C++ 向量
- 如何在c++中将浮点数组添加到浮点向量中
- 如何模板化函数以返回浮点数、整数或结构的向量
- 将 cv::Mat 向量复制到浮点数向量的最佳方法是什么?
- 将 LibSVM 输出转换为浮点数向量
- 向量类:4个浮点数之间的差异,或4个浮点数的数组
- C++ 向量输入<float>而不以非浮点数结尾
- 序列化浮点数向量
- 将由空格分隔的浮点数组成的文本文件映射到浮点数向量的内存