Я мигрирую из Matlab в C + GSL и хотел бы знать , каков наиболее эффективный способ вычисления матрицы B, для которого:
B[i][j] = exp(A[i][j])
где i в [0, Ny] и j в [0, Nx].
Обратите внимание, что это отличается от экспоненциальной матрицы:
B = exp(A)
, что может быть выполнено с помощью некоторого нестабильного / неподдерживаемого кода в GSL (linalg.h).
Я только что нашел решение для грубой силы (пара циклов for), но есть ли более разумный способ сделать это?
EDIT
Результаты поста решения Дрю Холла
Все результаты получены из цикла 1024x1024 for(for)
, в котором на каждой итерации назначаются два значения double
(комплексное число). Время - это усредненное время за 100 казней .
- Результаты при учете режима {Row, Column} -Major для хранения матрицы:
- 226,56 мс при циклическом цикле по строке во внутреннем цикле в режиме Row-Major (вариант 1).
- 223,22 мс при циклическом перемещении по столбцу во внутреннем цикле в режиме Row-Major (вариант 2).
- 224.60 мс при использовании функции
gsl_matrix_complex_set
, предоставляемой GSL (случай 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);
}
}