Matrix 如何在Fortran 90中获得nxn矩阵的共轭?

Matrix 如何在Fortran 90中获得nxn矩阵的共轭?,matrix,fortran,complex-numbers,built-in,Matrix,Fortran,Complex Numbers,Built In,我有一个复杂的矩阵,由下式给出: complex(rdp) :: a(:,:) 假设这个矩阵是nxn。如何共轭矩阵的每个条目?这有一个内在函数吗?正如米奇所评论的,这有一个标量函数: 编译器应该能够很容易地在数组上自动矢量化它;它只是对虚部的符号位进行XOR运算。利用SIMD1不需要内在特性 无论如何,在飞行中这样做是非常便宜的;在数组(或2D矩阵)上单独循环以应用此操作可能不是一个好主意,除非您要多次重新读取此数组。通过将共轭折叠到下一步所做的任何操作中,提高计算强度(每次加载/存储数据或将

我有一个复杂的矩阵,由下式给出:

complex(rdp) :: a(:,:)

假设这个矩阵是nxn。如何共轭矩阵的每个条目?这有一个内在函数吗?

正如米奇所评论的,这有一个标量函数:

编译器应该能够很容易地在数组上自动矢量化它;它只是对虚部的符号位进行XOR运算。利用SIMD1不需要内在特性

无论如何,在飞行中这样做是非常便宜的;在数组(或2D矩阵)上单独循环以应用此操作可能不是一个好主意,除非您要多次重新读取此数组。通过将共轭折叠到下一步所做的任何操作中,提高计算强度(每次加载/存储数据或将数据放入缓存时的ALU操作)

或者缓存块矩阵并共轭其中的一个块,然后再将该块提供给下一个操作


脚注1:
尽管对于复杂real8,SIMD甚至只在向量宽度大于128位=16字节=一个复杂real8的大小时才有用。如果这就是您所拥有的,那么您最好只使用标量xor。如果不将结果用于其他任何事情,x86编译器可以只使用异或dword[rdi+12],1Fortran标准具有
congg
内在特性。通常,它是一个
元素
内在函数,这意味着如果为它提供数组参数而不是标量,它将对数组的每个元素进行操作。例如

program conjgtest
  use iso_fortran_env, only: real64
  implicit none
  real(real64) :: r(2, 4)
  complex(real64) :: c(2,2)
  call random_number(r)
  c = cmplx(r(:, 1:2), r(:, 3:4), real64)
  print *, c
  print *, "conjugate:"
  print *, conjg(c)
end program conjgtest

@这是复数,我需要迭代每个条目吗?有没有办法一次得到整个矩阵的共轭?我的意思是,我必须做一个for循环,还是我可以做congg(a)?这不是我的意思。。。。我的意思是,如果它也适用于阵列…那么我发现它也适用!我猜答案只是做一个假设。你可能会对这里发生的术语感到困惑。在C语言中,内部函数是系统特定的函数,通常表示CPU指令,而在Fortran语言中,内部函数只是指编译器提供的函数,不需要任何外部库或模块。@VladimirF:是的,我从上下文中得到的印象是OP正以这种方式使用它,但没有意识到它的用法是正确的。(我真的不懂Fortran,我来这里是为了标记),所以这只是为了术语的C意思,而不是Fortran的意思)。标记完全符合Fortran的用法,因此我重新标记了问题。无论如何,我决定半故意地曲解这个问题,说一些关于性能的有趣的话。另外,我认为,告诉OP矩阵的内在特性可能不会使他们的代码运行得更快是一个有用的答案。