2

GSL では、実数n * m行列Mは size の配列として内部的に表されますn*m。の (i,j) 要素にMアクセスするために、GSL は内部的(i-1) * n + j - 1に配列の場所にアクセスする必要があり、これには整数の乗算と加算が含まれます。

nC の Numerical Recipesでは、それぞれが数値の配列を指すポインターの配列を宣言する代替方法を推奨していmます。次に、(i,j) 要素にアクセスするには、 を置きM[i-1][j-1]ます。彼らは、整数の乗算を回避するため、これがより効率的であると主張しています。欠点は、各ポインターを個別に初期化する必要があることです。

それぞれのアプローチの長所/短所は何ですか?

4

1 に答える 1

3

C:

#define n 2
#define m 3

int M[n*m];

と同じです

int M[n][m];

in C 行列は、行優先順に格納されると言われています

http://en.wikipedia.org/wiki/Row-major_order

Cでは、

M[1][2]

と同じです

*(M + 1*m + 2) // if M is define as M[n][m]

M を n 個のポインターの配列として定義することもできますが、それでもデータをどこかに配置する必要があり、最適な場所はおそらく 2D 配列です。私は提案します:

int M[n][m];

int* Mrows[n] = {M[0], M[1]};

次に、行に直接オフセットして、必要な行に到達できます。それで:

Mrows[1][2]

と同じです

*((*(Mrows + 1)) + 2)

プログラマーにとってはより多くの作業が必要であり、本当に速くしたい場合にのみ価値があります。その場合、特定のマシン命令など、より多くの最適化を検討することができます。また、アルゴリズムによっては、 + 操作だけを使用できる場合があります (マトリックスを反復処理する場合など)。

于 2012-07-15T04:14:12.823 に答える