2016-04-20 93 views
0

我翻译一个Matlab代码到Fortran 90的,我试图下面这段代码翻译:如何在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 

任何帮助将不胜感激。

回答

0

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

现代Fortran语句函数的一般建议是不要,只是不要。他们不大,他们不聪明。我认为它们在我认为是Fortran 90标准中也是被弃用的,因此,要迂腐,您的要求是不一致的。

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

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

来计算。

也许如果我们更了解问题的背景,我们可以提供更好的建议。

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 
+0

请注意,这样做的全部目的是对更复杂的函数使用相同的格式,因为这些函数很难继续写出一百万次。 –