3 votes

La manière la plus efficace de calculer l'exponentielle de chaque élément d'une matrice.

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);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X