【发布时间】:2015-03-09 15:08:42
【问题描述】:
例如,我想要一个函数来计算两个矩阵的交换子。我的实现方式是这样的:
function commutator_dd(MA,MB)
> result(MC)
implicit none
real*8,intent(in) :: MA(:,:)
real*8,intent(in) :: MB(:,:)
real*8,allocatable :: MC(:,:)
real*8,allocatable :: MP(:,:),MN(:,:)
integer :: nn
nn=size(MA,1)
allocate(MC(nn,nn),MP(nn,nn),MN(nn,nn))
MP=MATMUL(MA,MB)
MN=MATMUL(MB,MA)
MC=MP-MN
return;end function
我的一个朋友指出,分配数组而不释放它们可能不是一个好主意。我倾向于同意这一点,但因为在返回 main 之前我无法释放 MC(我认为 fortran 在退出程序后会自动释放它们,但据我记得留下这样的东西并不被认为是一个好习惯)。他建议将 nn 作为函数的输入,并将所有矩阵声明为 M(nn,nn),而不是使用分配(或至少使用 MC),但我有点不喜欢添加不必要的输入的想法。
另一种可能性是声明 MC(size(MA,1),size(MA,1)),但我之前遇到过这种语法的问题(我无法确定到底是什么问题,因为它是通过使用不同的传递变量的方法总是更容易绕过它,但我记得在尝试这样做时会收到编译器的抱怨)。
最好的方法是什么?内在过程(如 matmul)处理这个问题的方式是什么? (我试图用谷歌搜索 matmul 的代码,但我发现肯定没有我想象的那么简单)。
【问题讨论】:
-
计算完MC后不能释放MP和MN?为什么?
-
是的,我能做到。问题是 MC。
-
但是你要退货了。 MC的释放不是调用者的工作吗?
-
我相信你从功能中恢复的是 MC 的一些句柄,而不是整个 MC 副本。所以调用者必须考虑并取消分配 MC。 MP 和 MN 应在返回之前由被调用方释放
-
有助于“良好实践”的想法是 Fortran 90(在 Fortran 95 中更改)中围绕自动解除分配的一个功能。我想你不必担心这个?
标签: arrays function fortran dynamic-allocation