用 Fortran 将两个矩阵的行相乘以获得标量
Multiply the row of two matrix to obtain a scalar with Fortran
在几年没有使用 Fortran 之后,我在使用 matmul
时遇到了一些麻烦。假设我有两个矩阵: A_{N,K} 和 B_{J,K} 。我想创建一个子例程,它接受一行 A 和一行 B,将其相乘并创建标量 C。这就是我写的:
subroutine test_matmul(A, B, N, K, J, row_a, row_b, C)
integer, intent(in) :: N, K, J, row_a, row_b
double precision, dimension(N,K), intent(in) :: A
double precision, dimension(J,K), intent(in) :: B
double precision, intent(out) :: C
C = matmul(A(row_a,:), B(row_b,:))
end subroutine test_matmul
唉,当我尝试编译它时,出现以下错误:
C = matmul(A(row_a,:), B(row_b,:))
1
Error: 'matrix_b' argument of 'matmul' intrinsic at (1) must be of rank 2
我做错了什么?
错误很明显 matmul
乘以两个矩阵,而您正试图传递两个向量。如果将向量转换为矩阵,matmul
将通过另一个关于矩阵维度不匹配的错误。
您应该尝试使用 dot_product(vector_a, vector_b)
而不是 matmul
。
在几年没有使用 Fortran 之后,我在使用 matmul
时遇到了一些麻烦。假设我有两个矩阵: A_{N,K} 和 B_{J,K} 。我想创建一个子例程,它接受一行 A 和一行 B,将其相乘并创建标量 C。这就是我写的:
subroutine test_matmul(A, B, N, K, J, row_a, row_b, C)
integer, intent(in) :: N, K, J, row_a, row_b
double precision, dimension(N,K), intent(in) :: A
double precision, dimension(J,K), intent(in) :: B
double precision, intent(out) :: C
C = matmul(A(row_a,:), B(row_b,:))
end subroutine test_matmul
唉,当我尝试编译它时,出现以下错误:
C = matmul(A(row_a,:), B(row_b,:))
1
Error: 'matrix_b' argument of 'matmul' intrinsic at (1) must be of rank 2
我做错了什么?
错误很明显 matmul
乘以两个矩阵,而您正试图传递两个向量。如果将向量转换为矩阵,matmul
将通过另一个关于矩阵维度不匹配的错误。
您应该尝试使用 dot_product(vector_a, vector_b)
而不是 matmul
。