I'm migrating from Matlab to C + GSL and I would like to know what's the most efficient way to calculate the matrix B for which:
B[i][j] = exp(A[i][j]) where i in [0, Ny] and j in [0, Nx].
Notice that this is different from matrix exponential:
B = exp(A) which can be accomplished with some unstable/unsupported code in GSL (linalg.h).
I've just found the brute force solution (couple of 'for' loops), but is there any smarter way to do it?
EDIT
Results from the solution post of Drew Hall
All the results are from a 1024x1024 for(for) loop in which in each iteration two double values (a complex number) are assigned. The time is the averaged time over 100 executions.
- Results when taking into account the {Row,Column}-Major mode to store the matrix:
- 226.56 ms when looping over the row in the inner loop in Row-Major mode (case 1).
- 223.22 ms when looping over the column in the inner loop in Row-Major mode (case 2).
- 224.60 ms when using the
gsl_matrix_complex_setfunction provided by GSL (case 3).
Source code for case 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); } } Source code for case 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); } } Source code for case 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); } }
c_valueis not a constant. I just shortened the code to avoid it being too long. The actual code that I use is hosted in google code in the project gico-lib (which is kind of messy) around line 45 of signal.c. I'll try to fake the compiler (which is gcc 4.2.1 for Darwin (MacOsX)) with that trick and post the results later.