为了训练分类器,需要使用一组浮点数组指定训练数据。不幸的是,我可用的训练数据是字节数组(实际上它们是Ipp8u数组,可以转换为无符号字符数组)。
本质上,给定一个 unsigned char 数组,我需要将它转换为一个 float 数组:换句话说,给定一个 unsigned char 数组,我应该将它读取为一个 float 数组。是否始终允许此操作?浮点数据类型是否允许所有可能的位配置?如果是,如何实现这种转换?
为了训练分类器,需要使用一组浮点数组指定训练数据。不幸的是,我可用的训练数据是字节数组(实际上它们是Ipp8u数组,可以转换为无符号字符数组)。
本质上,给定一个 unsigned char 数组,我需要将它转换为一个 float 数组:换句话说,给定一个 unsigned char 数组,我应该将它读取为一个 float 数组。是否始终允许此操作?浮点数据类型是否允许所有可能的位配置?如果是,如何实现这种转换?
有很多方法可以近似实数。有一些浮点表示,其中一些位表示指数,另一些位表示系数,有一些定点表示,其中一些位表示整数部分,一些位表示派系部分,有任意有限精度表示,其中一些数量的存储某个基数中的“数字”等,并且对于每个一般的表示类别,在将该表示转换为float
s 时,都有无数种细节很重要。
您的问题没有指定字节数组包含的表示形式。指定数组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
.
如果字节序不同,则首先遍历字节数组并重新排序字节,如下所示:
// 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));
}
鉴于Intel Integrated Performance Primitives的文档,函数:
IppStatus ippsConvert_8u32f(const Ipp8u* pSrc, Ipp32f* pDst, int len);
似乎是最方便的功能,可以完全按照您的要求进行操作。
您应该明确地执行每个操作,而不是依赖隐式转换。首先读取 char 形式的数组
unsigned char charArray[100];
// reading
然后逐个转换元素
float floatArray[100];
for(i=0; i<100; ++i) {
floatArray[i] = (float) charArray[i];
}
您可以在 for 循环中使用atof运行迭代转换。然后你可以只使用浮点数组。我确信有一个单线解决方案。