如何在Fortran 90中使用带有数组的语句函数

时间:2016-04-20 16:55:58

标签: matlab fortran

我正在将Matlab代码翻译成Fortran 90并尝试翻译以下代码:

func= inline('x+ y+ z', 'x', 'y', 'z')
x(1)= 1, y(1)= 1, z(1)= 1

for n= 1:5
output= 5+ func(x(n), y(n), z(n))
x(n+ 1)= x(n)+ 1
y(n+ 1)= y(n)+ 1
z(n+ 1)= z(n)+ 1
end

在Fortran中我使用语句(内联)函数作为func(x,y,z)= x + y + z,但是,我无法将数组部分插入函数中。

我如何协商依赖' n'进入声明功能?我正在尝试类似下面的内容,但我还没有完成。

func(x, y, z)= x+ y+ z
x(1)= 1, y(1)= 1, z(1)= 1
do n= 1, 5
func(x(n), y(n), z(n))= x(n)+ y(n)+ z(n)
end

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这是一个扩展和格式化的评论,而不是答案。

现代Fortran中声明功能的一般建议是 Don,而不是。他们并不大,他们并不聪明。我认为,他们也被弃用了Fortran 90标准,因此,如果迂腐,你的要求是不一致的。

除此之外,很难提供任何具体的建议。如果我正确理解了Matlab,您展示的代码是一种计算5+3*1+3*2+...+3*5的复杂方法。在Fortran 90中你可以写

sum([5, (3*k,k=1,5)])

计算。

也许如果我们了解您问题的更多背景,我们就能提供更好的建议。

答案 1 :(得分:0)

我确实意识到现代Fortran中的语句功能不是可行的方法。相反,我已经为函数创建了子例程,然后在循环中调用它们。这样,循环中函数的所有值都可以放入一个数组中(而不仅仅是最后一个值)。正确的代码片段如下所示:

    subroutine funcsub(func, x, y, z, funcn)
    implicit none
    real, dimension(funcn), intent(out) :: func
    real, dimension(funcn), intent(in) :: x, y, z
    integer, intent(in) :: funky
    func= x+ y+ z
    end subroutine funcsub

    do i= 1, 5 
    funcn= size(func)    
    call funcsub(func, x(i), y(i), z(i), funcn)
    x(i+ 1)= x(i)+ 1
    y(i+ 1)= y(i)+ 1
    z(i+ 1)= z(i)+ 1
    end do