Je suis en train de migrer de Matlab vers C + GSL et j'aimerais savoir quelle est la manière la plus efficace de calculer la matrice B pour laquelle :
B[i][j] = exp(A[i][j])
où i dans [0, Ny] et j dans [0, Nx].
Notez que ceci est différent de la matrice exponentielle :
B = exp(A)
ce qui peut être réalisé avec du code instable/non supporté dans GSL (linalg.h).
Je viens de trouver la solution de force brute (quelques boucles 'for'), mais Y a-t-il une façon plus intelligente de le faire ?
EDITAR
Résultats du poste de solution de Drew Hall
Tous les résultats proviennent d'un écran de 1024x1024. for(for)
boucle dans laquelle, à chaque itération, deux double
(un nombre complexe) sont attribuées. Le temps est le temps moyen sur 100 exécutions. .
- Résultats lors de la prise en compte du mode {Row,Column}-Major pour stocker la matrice :
- 226,56 ms lors du bouclage de la ligne dans la boucle interne en mode Row-Major (cas 1).
- 223,22 ms lors du bouclage sur la colonne dans la boucle interne en mode Row-Major (cas 2).
- 224,60 ms en utilisant le
gsl_matrix_complex_set
fonction fournie par GSL (cas 3).
Code source pour le cas 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);
}
}
Code source pour le cas 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);
}
}
Code source pour le cas 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);
}
}