为了训练分类器,需要使用一组float数组指定训练数据。不幸的是,我可用的训练数据是字节数组(实际上它们是Ipp8u数组,可以转换为无符号字符数组。)
基本上,给定一个unsigned char数组,我需要将它转换为float数组:换句话说,给定一个unsigned char数组,我应该把它读作一个float数组。这个操作总是允许的吗?浮点数据类型是否允许所有可能的位配置?如果是,如何实现此转换?
答案 0 :(得分:5)
有很多方法可以逼近实数。有浮点表示,其中一些位表示指数,一些其他位表示系数,有固定点表示,其中一些位表示整数部分,一些位表示派系部分,有一些任意有限精度表示,其中一些数字'数字'在一些基础中存储等等,并且对于每个通用的表示类,存在无限多种细节,这在将该表示转换为float
时是重要的。
您的问题没有指定字节数组包含的表示形式。指定数组为Ipp8u
并不能提供必要的信息。
你可能意味着字节数组包含机器的float
s本地表示的字节表示(可能是IEEE-754),在字节顺序上最多不同。
您可以简单地将char
数组中的数据memcpy转换为浮点数组:
char c[10 * sizeof(float)] = {...};
float f[10];
std::memcpy(f, c, 10 * sizeof(float)); // or you can search for an implementation of bit_cast
不做的一件事就是简单地转换char
数组:float *f = reinterpret_cast<float*>(c);
此强制转换可能具有未定义的行为,因为float
可能具有比char
更严格的对齐要求。 / p>
如果endianess不同,那么首先遍历字节数组并重新排序字节,如下所示:
// assuming sizeof(float) == sizeof(uint32_t)
for (int i; i<sizeof c; i+=sizeof(float)) {
uint32_t i;
std::memcpy(&i, c + i, sizeof(uint32_t));
ntoh(i); // swaps bytes from Network TO Host order.
std::memcpy(c + i, &i, sizeof(uint32_t));
}
答案 1 :(得分:3)
鉴于Intel Integrated Performance Primitives的文档,函数:
IppStatus ippsConvert_8u32f(const Ipp8u* pSrc, Ipp32f* pDst, int len);
对于完全您正在寻找的内容来说似乎是最方便的功能。
答案 2 :(得分:1)
您应该明确地执行每个操作,而不是依赖隐式转换。第一个以char形式读取数组
unsigned char charArray[100];
// reading
然后通过obe
转换元素float floatArray[100];
for(i=0; i<100; ++i) {
floatArray[i] = (float) charArray[i];
}
答案 3 :(得分:0)
您可以在for循环中使用atof运行迭代转换。然后你可以使用float数组。我确信有一个单线解决方案。