我有一个简单的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)
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
是否发生此错误是因为您应该事先知道要返回的数组的大小?
答案 0 :(得分:5)
这正是错误告诉你的: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上为我编译。
答案 1 :(得分:0)
具有ALLOCATABLE属性的延迟形状数组称为可分配数组。由ALLOCATE语句为其分配存储空间时,将确定其边界和形状。
尝试
真实,意图(in),可分配,尺寸(:,:: A(:,:),B(:,:)
答案 2 :(得分:0)
您只需要将可分配数组定义为可分配数组,即将kron定义替换为;
real, allocatable, dimension(:,:) :: kron
这在4.6.3中也可以编译,并且定义为: https://docs.roguewave.com/codedynamics/2017.0/html/index.html#page/TotalViewLH/totalviewlhug-examining-data.09.10.html
希望这可以节省您一些精力,尤其是考虑到无需在此处定义下限!