あなたはおそらく...
を1次元配列に配列をキャストし、平坦化されたポインタを反復処理することができ、私は説明します:
あなたはおそらく知っているように、メモリ内の2次元配列が格納されています平らな状態で。この例では
| c[0][0] | | c[0][1] | | c[1][0] | | c[1][1] | | c[2][0] | ...
| Byte 1 | | Byte 2 | | Byte 3 | | Byte 4 | | Byte 5 | ...
、c[1][1]
== ((char*)c)[3]
:配列char c[4][2]
はこのようになります。このため
dbushが指摘するように、すべてのメンバーが同じタイプであるとき、それは安全に1次元配列に2次元配列をキャストすることが可能です、すなわち
int my_array[20][20];
for (int i = 0; i < 400 ; i++) {
((int *)(my_array))[i] = i;
}
// my_array[19][0] == 180;
(アップ彼の答えを投票)、もしあなたの行列はM x Mの要素です。そして、M^2はあなたが得ようとしている最良の配列です。このように配列を平坦化すれば、操作の前にメモリをコピーする必要がなくなります。良いかもしれない1次元配列に配列をキャストする理由
EDIT
誰かが尋ねました。
考え方は、ネストされた内部ループを回避し、オプティマイザの作業を容易にすることです。コンパイラは、ループが単一のディメンションループであり、配列のサイズが固定されている場合、ループを展開する可能性が高くなります。
私は、このようなアプローチがキャッシュに影響を与えるので、物事を非常に遅くすると推測しています。 –
列と行を検索すると、空間的な場所が失われます。どのくらいの速さのアルゴリズムが実行されるかを決める唯一のことではないことを覚えておきましょ実際には、長さN * Nの平坦な1次元配列の最大値を得るよりも速くなることはありません。 – Matt
マルチコアを使用すると、コアごとの複雑さを減らすことができます。 1コアあたりの行ごとに最大値を見つけること。最大値の最大値を求めます。 –