Fortran数组排名为matmul内在

时间:2017-06-02 14:56:33

标签: fortran gfortran intrinsics

以下链接https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gfortran/MATMUL.html明确指出gfortran期望输入到matmul的矩阵的等级为1或2.但是下面的代码片段不会编译:

Program scratch
  real(kind=8) :: A(10)=(/0,1,2,3,4,5,6,7,8,9/)
  real(kind=8) :: B(10)=(/0,1,2,3,4,5,6,7,8,9/)
  real(kind=8) :: C(10,10)
  print *,rank(A),rank(B)
  C=matmul(A,B)  
End Program scratch

gfortran给出错误:

$gfortran scratch.f90 
scratch.f90:6:13:

   C=matmul(A,B)
         1
Error: ‘matrix_b’ argument of ‘matmul’ intrinsic at (1) must be of rank 2

我的gfortran是5.4.0(与上面的链接兼容)。我做的事真的很蠢吗?

2 个答案:

答案 0 :(得分:1)

您必须为两个向量的张量积

执行此操作
Program scratch
  integer, parameter :: dp = kind(1.d0)
  real(dp) :: A(10,1)=reshape((/0,1,2,3,4,5,6,7,8,9/), (/ 10, 1 /))
  real(dp) :: B(1,10)=reshape((/0,1,2,3,4,5,6,7,8,9/), (/ 1, 10 /))
  real(dp) :: C(10,10)
  print *,rank(A),rank(B)
  C=matmul(A,B)
  print *, C
End Program scratch

如果你这样做

   A(1,10)
   B(10,1)

你会得到一个标量产品。只有两个1D阵列,你不清楚你想要的两个产品中的哪一个(虽然对于点积有一个特殊的功能)。

当您将矩阵乘以向量时,A或B可以是一维数组。

答案 1 :(得分:1)

您可以使用RESHAPE将其转换为MATMUL形式:

Program scratch
  real(kind=8) :: A(10)=(/0,1,2,3,4,5,6,7,8,9/)
  real(kind=8) :: B(10)=(/0,1,2,3,4,5,6,7,8,9/)
  real(kind=8) :: C(10,10)
  print *,rank(A),rank(B)
  C = matmul( RESHAPE(A,(/10,1/)), RESHAPE(B,(/1,10/)) )
  WRITE(*,"(10F7.2)") C
End Program scratch