2016-04-20 94 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

請注意,這樣做的全部目的是對更復雜的函數使用相同的格式,因爲這些函數很難繼續寫出一百萬次。 –