矩阵操作和线性代数在科学计算和工程应用中非常重要。Fortran提供了强大的矩阵操作功能,特别是通过BLAS和LAPACK库可以方便地进行复杂的线性代数运算。本文将介绍如何在Fortran中进行矩阵操作,并提供一些实用的示例。
示例1: 矩阵的基本操作
矩阵的初始化和打印
以下代码展示了如何在Fortran中初始化和打印矩阵。
fortran
复制代码
program matrix_operations
implicit none
integer, parameter :: n = 3, m = 3
real :: A(n, m)
integer :: i, j
! 初始化矩阵
do i = 1, n
do j = 1, m
A(i, j) = real(i * j)
end do
end do
! 打印矩阵
print *, 'Matrix A:'
do i = 1, n
print *, (A(i, j), j=1, m)
end do
end program matrix_operations
代码解释
初始化矩阵: 使用嵌套的 do 循环初始化矩阵 A 的元素。打印矩阵: 使用嵌套的 do 循环打印矩阵 A 的元素。编译和运行
要编译并运行上述代码,可以使用如下命令:
bash
复制代码
gfortran matrix_operations.f90 -o matrix_operations
./matrix_operations
示例2: 矩阵的加法和减法
矩阵的加法和减法
以下代码展示了如何在Fortran中进行矩阵的加法和减法。
fortran
复制代码
program matrix_add_sub
implicit none
integer, parameter :: n = 3, m = 3
real :: A(n, m), B(n, m), C(n, m), D(n, m)
integer :: i, j
! 初始化矩阵A和B
do i = 1, n
do j = 1, m
A(i, j) = real(i * j)
B(i, j) = real(i + j)
end do
end do
! 矩阵加法 C = A + B
C = A + B
! 矩阵减法 D = A - B
D = A - B
! 打印结果
print *, 'Matrix A:'
do i = 1, n
print *, (A(i, j), j=1, m)
end do
print *, 'Matrix B:'
do i = 1, n
print *, (B(i, j), j=1, m)
end do
print *, 'Matrix C (A + B):'
do i = 1, n
print *, (C(i, j), j=1, m)
end do
print *, 'Matrix D (A - B):'
do i = 1, n
print *, (D(i, j), j=1, m)
end do
end program matrix_add_sub
代码解释
初始化矩阵A和B: 使用嵌套的 do 循环初始化矩阵 A 和 B 的元素。矩阵加法: 使用 C = A + B 进行矩阵 A 和 B 的加法运算。矩阵减法: 使用 D = A - B 进行矩阵 A 和 B 的减法运算。打印结果: 使用嵌套的 do 循环打印矩阵 A、B、C 和 D 的元素。编译和运行
要编译并运行上述代码,可以使用如下命令:
bash
复制代码
gfortran matrix_add_sub.f90 -o matrix_add_sub
./matrix_add_sub
示例3: 矩阵乘法
矩阵乘法
以下代码展示了如何在Fortran中进行矩阵的乘法。
fortran
复制代码
program matrix_multiplication
implicit none
integer, parameter :: n = 3, m = 3, p = 3
anhui.lykeu.com/uDx1bj/
beijing.lykeu.com/VJz9QI/
chongqing.lykeu.com/8c4VWC/
fujian.lykeu.com/YRPV3i/
gansu.lykeu.com/jjln8e/
guangdong.lykeu.com/sR6ehG/
real :: A(n, m), B(m, p), C(n, p)
integer :: i, j, k
! 初始化矩阵A和B
do i = 1, n
do j = 1, m
A(i, j) = real(i + j)
end do
end do
do i = 1, m
do j = 1, p
B(i, j) = real(i * j)
end do
end do
! 矩阵乘法 C = A * B
C = 0.0
do i = 1, n
do j = 1, p
do k = 1, m
C(i, j) = C(i, j) + A(i, k) * B(k, j)
end do
end do
end do
! 打印结果
print *, 'Matrix A:'
do i = 1, n
print *, (A(i, j), j=1, m)
end do
print *, 'Matrix B:'
do i = 1, m
print *, (B(i, j), j=1, p)
end do
print *, 'Matrix C (A * B):'
do i = 1, n
print *, (C(i, j), j=1, p)
end do
end program matrix_multiplication
代码解释
初始化矩阵A和B: 使用嵌套的 do 循环初始化矩阵 A 和 B 的元素。矩阵乘法: 使用嵌套的 do 循环进行矩阵 A 和 B 的乘法运算,并将结果存储在矩阵 C 中。打印结果: 使用嵌套的 do 循环打印矩阵 A、B 和 C 的元素。编译和运行
要编译并运行上述代码,可以使用如下命令:
bash
复制代码
gfortran matrix_multiplication.f90 -o matrix_multiplication
./matrix_multiplication
示例4: 使用LAPACK进行矩阵求逆
矩阵求逆
以下代码展示了如何在Fortran中使用LAPACK库进行矩阵的求逆。
fortran
复制代码
program matrix_inverse
use, intrinsic :: iso_c_binding
implicit none
integer, parameter :: n = 3
real(c_double) :: A(n, n), work(n*n)
integer :: ipiv(n), info, lwork
! 初始化矩阵A
A = reshape([3.0d0, 1.0d0, 2.0d0, &
1.0d0, 2.0d0, 3.0d0, &
2.0d0, 3.0d0, 1.0d0], [n, n])
! 打印原始矩阵
print *, 'Original Matrix A:'
call print_matrix(A)
! 调用LAPACK函数进行矩阵求逆
call dgetrf(n, n, A, n, ipiv, info)
if (info /= 0) then
print *, 'Error in LU factorization, info = ', info
stop
end if
lwork = n*n
call dgetri(n, A, n, ipiv, work, lwork, info)
if (info /= 0) then
print *, 'Error in matrix inversion, info = ', info
stop
end if
! 打印逆矩阵
print *, 'Inverse Matrix A^-1:'
call print_matrix(A)
contains
subroutine print_matrix(A)
real(c_double), intent(in) :: A(n, n)
integer :: i, j
do i = 1, n
print *, (A(i, j), j=1, n)
end do
end subroutine print_matrix
end program matrix_inverse
代码解释
初始化矩阵A: 使用 reshape 函数初始化矩阵 A 的元素。调用LAPACK函数进行矩阵求逆: 使用 dgetrf 进行LU分解,然后使用 dgetri 进行矩阵求逆。打印结果: 使用自定义子程序 print_matrix 打印矩阵 A 的元素。