如何在 fortran 函数中输出 2 个或更多数组?
How to output 2 or more arrays in a fortran's function?
我正在编写一个程序来计算矩阵的 LU 分解,并进行部分旋转,我希望该函数可以输出多个(2 或 3)矩阵,而无需 运行 多次调用程序单独输出每一个,这是浪费时间,因为它让我在一个 运行 中得到我想要的一切。有没有办法做到这一点?例如,这是我使用 Doolittle 算法的函数,用于不需要旋转的方矩阵。我希望我的输出同时是矩阵 l 和 u,但我不知道这样做的方法。
function lu_d(aa) result(l)
real, dimension (:,:) :: aa !input matrix
real, dimension (size(aa,1), size(aa,2)) :: a !keeping input variable intact
real, dimension (size(a,1), size(a,2)) :: l , u !lower and upper matrices
integer :: i,j,k !index
real :: s !auxiliar variable
a=aa
do j=1 , size(a,2)
u(1,j)=a(1,j)
end do
l(1,1)=1
do j=2, size(a,2)
l(1,j)=0
end do
do i=2, size(a,1)
l(i,1)=a(i,1)/u(1,1)
u(i,1)=0
do j=2, i-1
s=0
u(i,j)=0
do k=1, j-1
s=s+l(i,k)*u(k,j)
end do
l(i,j)=(a(i,j)-s)/u(j,j)
end do
l(i,i)=1
do j=i, size(a,2)
s=0
l(i,j)=0
do k=1, i-1
s=s+l(i,k)*u(k,j)
end do
u(i,j)=a(i,j)-s
end do
end do
end function
您可以从使用函数切换到使用子例程。这样您就可以输出参数列表中多个数组的值。另外使用
INTENT
在子程序中声明变量时定义,例如:
REAL,INTENT(IN)::a
声明 a 并且不允许在 subroutine/function
中更改其值
REAL,INTENT(OUT)::b
声明 b 并忽略它进入 subroutine/function
的任何值
REAL,INTENT(INOUT)::c
默认是这样的,如果什么都不写的话
我假设您需要输出 l
和 u
(而不是 m
),在这种情况下,结构将类似于下面的结构。请注意,l
和 m
应该在主程序中声明,并且它们的大小根据 aa
定义(如下面第一种情况所示),或者用 [=22= 声明] 大小在主程序中,传递给子程序而不在子程序内分配和分配(第二个例子)。后者可能需要您将子例程放入模块中,以便正确处理接口。
第一个例子:
SUBROUTINE lu_d(aa,l,m)
implicit none
real,intent(in):: a(:,:)
real,intent(out):: l(:,:), m(:,:)
integer:: i,j,k
real:: s
<operations>
RETURN
END SUBROUTINE lud_d
第二个例子:
SUBROUTINE lu_d(aa,l,m)
implicit none
real,intent(in):: a(:,:)
real,allocatable,intent(out):: l(:,:), m(:,:)
integer:: i,j,k,size_a1,size_a2
real:: s
size_a1=size(aa,1)
size_a2=size(aa,2)
allocate( l(size_a1,size_a2), m(size_a1,size_a2))
<operations>
RETURN
END SUBROUTINE lud_d
我正在编写一个程序来计算矩阵的 LU 分解,并进行部分旋转,我希望该函数可以输出多个(2 或 3)矩阵,而无需 运行 多次调用程序单独输出每一个,这是浪费时间,因为它让我在一个 运行 中得到我想要的一切。有没有办法做到这一点?例如,这是我使用 Doolittle 算法的函数,用于不需要旋转的方矩阵。我希望我的输出同时是矩阵 l 和 u,但我不知道这样做的方法。
function lu_d(aa) result(l)
real, dimension (:,:) :: aa !input matrix
real, dimension (size(aa,1), size(aa,2)) :: a !keeping input variable intact
real, dimension (size(a,1), size(a,2)) :: l , u !lower and upper matrices
integer :: i,j,k !index
real :: s !auxiliar variable
a=aa
do j=1 , size(a,2)
u(1,j)=a(1,j)
end do
l(1,1)=1
do j=2, size(a,2)
l(1,j)=0
end do
do i=2, size(a,1)
l(i,1)=a(i,1)/u(1,1)
u(i,1)=0
do j=2, i-1
s=0
u(i,j)=0
do k=1, j-1
s=s+l(i,k)*u(k,j)
end do
l(i,j)=(a(i,j)-s)/u(j,j)
end do
l(i,i)=1
do j=i, size(a,2)
s=0
l(i,j)=0
do k=1, i-1
s=s+l(i,k)*u(k,j)
end do
u(i,j)=a(i,j)-s
end do
end do
end function
您可以从使用函数切换到使用子例程。这样您就可以输出参数列表中多个数组的值。另外使用
INTENT
在子程序中声明变量时定义,例如:
REAL,INTENT(IN)::a
声明 a 并且不允许在 subroutine/function
REAL,INTENT(OUT)::b
声明 b 并忽略它进入 subroutine/function
REAL,INTENT(INOUT)::c
默认是这样的,如果什么都不写的话
我假设您需要输出 l
和 u
(而不是 m
),在这种情况下,结构将类似于下面的结构。请注意,l
和 m
应该在主程序中声明,并且它们的大小根据 aa
定义(如下面第一种情况所示),或者用 [=22= 声明] 大小在主程序中,传递给子程序而不在子程序内分配和分配(第二个例子)。后者可能需要您将子例程放入模块中,以便正确处理接口。
第一个例子:
SUBROUTINE lu_d(aa,l,m)
implicit none
real,intent(in):: a(:,:)
real,intent(out):: l(:,:), m(:,:)
integer:: i,j,k
real:: s
<operations>
RETURN
END SUBROUTINE lud_d
第二个例子:
SUBROUTINE lu_d(aa,l,m)
implicit none
real,intent(in):: a(:,:)
real,allocatable,intent(out):: l(:,:), m(:,:)
integer:: i,j,k,size_a1,size_a2
real:: s
size_a1=size(aa,1)
size_a2=size(aa,2)
allocate( l(size_a1,size_a2), m(size_a1,size_a2))
<operations>
RETURN
END SUBROUTINE lud_d