MatlabからC+GSLに移行していますが、行列Bを計算するための最も効率的な方法を知りたいです。
B[i][j] = exp(A[i][j])
ここで、iは[0、Ny]に、jは[0、Nx]にあります。
これは行列指数とは異なることに注意してください。
B = exp(A)
これは、GSL(linalg.h)の不安定な/サポートされていないコードで実現できます。
強引な解決策(「for」ループのカップル)を見つけましたが、それを行うためのよりスマートな方法はありますか?
編集
ドリューホールのソリューションポストからの結果
すべての結果は1024x1024for(for)
ループからのものであり、各反復で2つのdouble
値(複素数)が割り当てられます。時間は、100回の実行の平均時間です。
- {Row、Column}を考慮した場合の結果-行列を格納するためのメジャーモード:
- Row-Majorモード(ケース1)で、内側のループの行をループする場合、226.56ミリ秒。
- 行メジャーモード(ケース2)で内部ループの列をループする場合は223.22ミリ秒。
- GSLが提供する機能を使用する場合は224.60ミリ秒
gsl_matrix_complex_set
(ケース3)。
ケース1のソースコード:
for(i=0; i<Nx; i++)
{
for(j=0; j<Ny; j++)
{
/* Operations to obtain c_value (including exponentiation) */
matrix[2*(i*s_tda + j)] = GSL_REAL(c_value);
matrix[2*(i*s_tda + j)+1] = GSL_IMAG(c_value);
}
}
ケース2のソースコード:
for(i=0; i<Nx; i++)
{
for(j=0; j<Ny; j++)
{
/* Operations to obtain c_value (including exponentiation) */
matrix->data[2*(j*s_tda + i)] = GSL_REAL(c_value);
matrix->data[2*(j*s_tda + i)+1] = GSL_IMAG(c_value);
}
}
ケース3のソースコード:
for(i=0; i<Nx; i++)
{
for(j=0; j<Ny; j++)
{
/* Operations to obtain c_value (including exponentiation) */
gsl_matrix_complex_set(matrix, i, j, c_value);
}
}