3

私は3つのチャンネルを持っています:

byte[] Red;
byte[] Green;
byte[] Blue;

それらからすべての値を a にコピーする必要があるbyte[Red.Length+Green.Length+Blue.Length] PAため、次のようになります。

PA[0] = Red[0];
PA[1] = Green[0];
PA[2] = Blue[0];
PA[3] = Red[1];
/// and so on

上記の配列を使用した例を次に示します。

byte[] Red = new byte[255];
byte[] Green = new byte[255];
byte[] Blue = new byte[255];
byte[] PA = new byte[Red.Length + Green.Length + Blue.Length];
for (int i = 0; i != 255; ++i)
{
    PA[i*3 + 0] = Red[i];
    PA[i*3 + 1] = Green[i];
    PA[i*3 + 2] = Blue[i];
}

マージされるコレクションは同じサイズであり、「マージされた」コレクション内のアイテムのために保持する必要がある、など[0] = Redの順序があると想定しています。[1]=Green

でこれを行う最も効率的な方法は何C#ですか? コレクションは、配列やアイテムのバイトである必要はありません (ただし、バイトを受け入れるコレクション型は歓迎されます)。

4

3 に答える 3

5

3*i私は乗算を避けようとします:

byte[] Red = new byte[255];
byte[] Green = new byte[255];
byte[] Blue = new byte[255];
int newSize = Red.Length + Green.Length + Blue.Length;
byte[] PA = new byte[newSize];
for (int i = 0; i < newSize; i += 3)
{
    PA[i + 0] = Red[i];
    PA[i + 1] = Green[i];
    PA[i + 2] = Blue[i];
}

編集

またはそのようなもの:

for (int i = 0, j = 0; i < 255; i++)
{
    PA[j++] = Red[i];
    PA[j++] = Green[i];
    PA[j++] = Blue[i];
}

(ウィクターの提案)

于 2013-03-19T08:03:40.653 に答える
5

ポインターを使用して、より効率的な方法を作成しようとしました。

unsafe {
  fixed (byte* red = Red, green = Green, blue = Blue, pa = PA2) {
    byte* r = red, g = green, b = blue, p = pa;
    for (int i = 0; i < 255; i++) {
      *p = *r; p++; r++;
      *p = *g; p++; g++;
      *p = *b; p++; b++;
    }
  }
}

x86 モードでは約 2 倍の速さですが、x64 モードでは違いはありません。

結論として、あなたが持っているコードは、ほとんどのアプリケーションにとって十分に高速です。本当に高速にする必要がある場合は、少し最適化できますが、それほど多くはありません。

于 2013-03-19T08:36:52.960 に答える
2

効率性は薄い意思決定層ですが、パフォーマンスの観点からは、すでに効率的な方法でそれを行っていると言えます。

//allocate immediately memory need, so more shrinking of memory will happen 
byte[] PA = new byte[Red.Length + Green.Length + Blue.Length]; 

//use for loop, that normally equals to foreach in some cases is faster
for (int i = 0; i != 255; ++i)
{
    PA[i + 0] = Red[i];
    PA[i + 1] = Green[i];
    PA[i + 2] = Blue[i];
}
于 2013-03-19T08:02:55.280 に答える