什么是;数组不能具有延迟形状“0”;用fortran是什么意思?
我有一个简单的fortran函数,用于计算Kronecker产品:什么是;数组不能具有延迟形状“0”;用fortran是什么意思?,fortran,gfortran,fortran2003,Fortran,Gfortran,Fortran2003,我有一个简单的fortran函数,用于计算Kronecker产品: function kron(A, B) implicit none real, intent(in) :: A(:, :), B(:, :) integer :: i, j, ma, na, mb, nb real, dimension(:, :) :: kron ma = ubound(A, 1) na = ubound(A, 2) mb = ubound(b, 1)
function kron(A, B)
implicit none
real, intent(in) :: A(:, :), B(:, :)
integer :: i, j, ma, na, mb, nb
real, dimension(:, :) :: kron
ma = ubound(A, 1)
na = ubound(A, 2)
mb = ubound(b, 1)
nb = ubound(b, 2)
forall(i=1:ma, j=1:na)
kron(mb*(i-1)+1:mb*i, nb*(j-1)+1:nb*j) = A(i,j)*B
end forall
end function kron
它在一个模块内,但是当我使用gfortran-static-ffree form-std=f2003-Wall
编译它时,我得到以下错误:
function kron(A, B)
1
Error: Array 'kron' at (1) cannot have a deferred shape
发生此错误是因为您应该事先知道要返回的数组的大小吗?这正是错误告诉您的:
kron
必须具有明确的形状。如果不想事先传递数组大小,则必须将kron
定义为
real, dimension(lbound(a,dim=1):ubound(a,dim=1),&
lbound(a,dim=2):ubound(a,dim=2)) :: kron
在gfortran 4.6.3上使用上述特定的显式声明确实可以为我编译。具有可分配属性的延迟形状数组称为可分配数组。当通过ALLOCATE语句为其分配存储时,将确定其边界和形状 试试这个
real、intent(in)、allocatable、dimension(:,::A(:,:)、B(:,:)您只需要将可分配数组定义为可分配数组,即将kron定义替换为
real, allocatable, dimension(:,:) :: kron
这也适用于4.6.3,定义如下:
希望这能为您节省一些精力,特别是考虑到这里不需要定义下限!谢谢。我想没有办法不为每个维度调用
lbound
两次,对吧?因为我在分配ma
和其他变量时再次调用它。我也更正了问题中的拼写错误,既然A(i*j)*B
应该是A(i,j)*B
@user2766558实际上,再看一遍,数组kron
的维度应该是(a1*b1,a2*b2)
,其中a1=ubound(A,dim=1)-lbound(A,dim=1)+1
和其他类似。奇怪。运行您给我的代码确实有效,但可能只是为了我的简单示例。不会a1=size(a,1)
,a2=size(a,2)
也能工作吗?如果我做了更改,代码会正确编译/运行。比如说。是的,size
可以工作。但是,请注意,如果a
或b
的起始索引小于1,那么在定义kron
时就会有一个小问题,我甚至不知道这是可能的。我认为所有数组s在Fortran中是1索引的,但我想这对于与C的兼容性是有意义的,对吗?我只是将此代码用于个人用途,可能不会重新定义开始索引。除非我遗漏了其他内容,否则我将接受您的答案。这不能作为(a.o.)方括号的数量不匹配。这与函数kron的返回变量/名称有何关系?否!或者不仅仅如此。您不能仅使其可分配。以后使用它的方式将是非法使用未分配的数组。