2

分類器をトレーニングするには、float配列のセットを使用してトレーニングデータを指定する必要があります。残念ながら、私が利用できるトレーニングデータはバイト配列です(実際にはIpp8u配列であり、unsigned char配列に変換できます)。

基本的に、unsigned char配列が与えられた場合、それをfloat配列に変換する必要があります。つまり、unsigned char配列が与えられた場合、float配列として読み取る必要があります。この操作は常に許可されていますか?floatデータ型はビットのすべての可能な構成を許可しますか?はいの場合、この変換を実装する方法は?

4

4 に答える 4

6

実数を概算する方法はたくさんあります。一部のビットが指数を表し、他の一部のビットが係数を表す浮動小数点表現があり、一部のビットが整数部分を表し、一部のビットが派閥部分を表す固定小数点表現があり、任意の有限精度表現があります。一部のベースの「数字」などが格納され、一般的な表現クラスごとに、その表現をfloatsに変換するときに重要となるさまざまな詳細があります。

あなたの質問は、バイト配列に含まれる表現を指定していません。配列を指定してもIpp8u、必要な情報を提供することはできません。


おそらく意味するのは、バイト配列には、マシンのネイティブ表現であるfloats(おそらくIEEE-754)のバイト表現が含まれており、エンディアンが最大で異なるということです。

char配列からfloatの配列にデータの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

してはいけないことの1つは、char配列を単純にキャストすることです。おそらく、よりも厳密な配置要件がfloat *f = reinterpret_cast<float*>(c);あるため、このキャストはおそらく未定義の動作をします。floatchar

エンディアンが異なる場合は、最初にバイト配列を調べて、次のようにバイトを並べ替えます。

// 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

インテルインテグレーテッドパフォーマンスプリミティブのドキュメントを考えると、関数は次のとおりです。

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

あなたが探していることを正確に行うための最も便利な機能のように思われるでしょう。

于 2013-01-06T22:57:44.707 に答える
2

暗黙の変換に依存するのではなく、各操作を明示的に実行する必要があります。最初にchar形式で配列を読み取ります

unsigned char charArray[100];
// reading 

次に、要素を1つに変換します

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

forループでatofを利用して反復変換を実行するだけで済みます。次に、float配列を使用できます。しかし、1行の解決策があると確信しています。

于 2013-01-06T22:16:06.043 に答える