)R1 G1 B1 R2 G2 B2 R3 G3 B3 ... Rn Gn Bn
になるバイトRGB値のフラットな配列があります。だから、私のデータは次のようになります。RGB値の配列から平面を切り取るアルゴリズム(
char imageData[WIDTH * HEIGHT * 3];
しかし、私は、このデータの単一平面を想定し、既存のCライブラリにWIDTH * HEIGHT配列を渡したいです。これは、R値(または単にG、またはBのみ)のシーケンスです。
新しい配列を割り当ててデータ(duh)をコピーするのは簡単です。しかし、イメージは非常に大きいです。もしそれがCライブラリではなく、 "スライシング"トラバーサルをフィニッシュするための何らかの反復インタフェースをとったなら、それは素晴らしいことでしょう。しかし、私は呼び出しているコードを編集することはできません...シーケンシャルメモリのブロックへの普通の古いポインタが必要です。
ただし、この配列への書き込みアクセス権があります。カラープレーンにソートするルーチンを作成することは実行可能です。私はまたそれを戻す逆変換が必要ですが、定義上、それをプレーンにソートした同じメソッドを適用してソートを解除することができます。
このアレイを効率的に(効率的に)R1 R2 R3 ... Rn G1 G2 G3 ... Gn B1 B2 B3 ... Bn
にしてから、もう一度戻すことはできますか?非純粋なアルゴリズムはありますか?
あなたは、3xN行列を転置することについて話しています。素朴な転置操作は、キャッシュミスがいっぱいであるため非効率的です。 "キャッシュ効率のよい転置"のGoogle –
http://en.wikipedia.org/wiki/In-place_matrix_transposition#Algorithms – FUD
正直言って私はもっと多くのメモリを割り当てると考えるべきだと思っています。非正方行列の置き換えは厄介です – FUD