面试题答案
一键面试program matrix_multiplication
use, intrinsic :: iso_fortran_env, only: wp => real64
implicit none
integer, parameter :: m = 3, n = 4, p = 2
real(wp) :: A(m, n), B(n, p), C(m, p)
integer :: i, j, k
! 初始化矩阵A和B
A = reshape([(real(i*j, wp), i = 1, m), j = 1, n], [m, n])
B = reshape([(real(i + j, wp), i = 1, n), j = 1, p], [n, p])
! 矩阵乘法 C = A * B
do i = 1, m
do j = 1, p
C(i, j) = sum(A(i, :) * B(:, j))
end do
end do
! 输出结果
write(*,*) '矩阵A:'
do i = 1, m
write(*,*) A(i, :)
end do
write(*,*) '矩阵B:'
do i = 1, n
write(*,*) B(i, :)
end do
write(*,*) '矩阵C = A * B:'
do i = 1, m
write(*,*) C(i, :)
end do
end program matrix_multiplication
关键步骤解释
- 矩阵定义与初始化:定义了矩阵
A
、B
和结果矩阵C
,并使用reshape
函数对矩阵进行初始化。 - 矩阵乘法:通过嵌套循环遍历矩阵
A
和B
的元素,使用sum
函数计算矩阵乘法的结果。sum(A(i, :) * B(:, j))
这一步利用了Fortran的数组运算特性,将A
的第i
行与B
的第j
列对应元素相乘后求和,高效地完成矩阵乘法的单个元素计算。 - 结果输出:将矩阵
A
、B
和计算得到的矩阵C
输出到控制台。
利用数学函数库提高效率
在这个实现中,使用了Fortran内置的sum
函数。sum
函数在Fortran数学函数库中经过优化,能够高效地进行求和运算。相比于手动编写循环进行求和,sum
函数利用了底层的优化机制,例如并行计算等(在支持的编译器和硬件环境下),从而大大提高了矩阵乘法中大量数值求和运算的效率。同时,Fortran的数组运算特性也减少了显式循环的使用,进一步优化了代码的执行效率。