我正在从 Matlab 迁移到 C + GSL,我想知道计算矩阵 B 的最有效方法是什么:
B[i][j] = exp(A[i][j])
其中 i 在 [0, Ny] 中,j 在 [0, Nx] 中。
请注意,这与矩阵指数不同:
B = exp(A)
这可以通过 GSL (linalg.h) 中的一些不稳定/不受支持的代码来完成。
我刚刚找到了蛮力解决方案(几个“for”循环),但是有没有更聪明的方法呢?
编辑
来自 Drew Hall 解决方案帖子的结果
所有结果都来自一个 1024x1024for(for)
循环,其中在每次迭代double
中分配两个值(一个复数)。时间是超过 100 次执行的平均时间。
- 考虑到 {Row,Column}-Major 模式来存储矩阵时的结果:
- 在 Row-Major 模式下循环内循环中的行时为 226.56 毫秒(案例 1)。
- 以 Row-Major 模式在内部循环中循环列时为 223.22 毫秒(案例 2)。
- 使用 GSL 提供的功能时为 224.60 ms
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);
}
}