2

为了训练分类器,需要使用一组浮点数组指定训练数据。不幸的是,我可用的训练数据是字节数组(实际上它们是Ipp8u数组,可以转换为无符号字符数组)。

本质上,给定一个 unsigned char 数组,我需要将它转换为一个 float 数组:换句话说,给定一个 unsigned char 数组,我应该将它读取为一个 float 数组。是否始终允许此操作?浮点数据类型是否允许所有可能的位配置?如果是,如何实现这种转换?

4

4 回答 4

6

有很多方法可以近似实数。有一些浮点表示,其中一些位表示指数,另一些位表示系数,有一些定点表示,其中一些位表示整数部分,一些位表示派系部分,有任意有限精度表示,其中一些数量的存储某个基数中的“数字”等,并且对于每个一般的表示类别,在将该表示转换为floats 时,都有无数种细节很重要。

您的问题没有指定字节数组包含的表示形式。指定数组Ipp8u不接近提供必要的信息。


您可能的意思是字节数组包含机器对floats 的本机表示(可能是 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));
}
于 2013-01-06T23:17:57.123 回答
3

鉴于Intel Integrated Performance Primitives的文档,函数:

IppStatus ippsConvert_8u32f(const Ipp8u* pSrc, Ipp32f* pDst, int len);

似乎是最方便的功能,可以完全按照您的要求进行操作。

于 2013-01-06T22:57:44.707 回答
2

您应该明确地执行每个操作,而不是依赖隐式转换。首先读取 char 形式的数组

unsigned char charArray[100];
// reading 

然后逐个转换元素

float floatArray[100];
for(i=0; i<100; ++i) {
   floatArray[i] = (float) charArray[i];
}
于 2013-01-06T22:16:00.043 回答
-1

您可以在 for 循环中使用atof运行迭代转换。然后你可以只使用浮点数组。我确信有一个单线解决方案。

于 2013-01-06T22:16:06.043 回答