2016-04-20 10 views
0

Ich bin ein Matlab-Code in Fortran 90 zu übersetzen und ich versuche, das folgende Stück Code zu übersetzen:Wie Anweisung Funktionen mit Arrays in Fortran verwendet 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 

In Fortran ich die Aussage verwenden (Inline) Funktion als func (x, y, z) = x + y + z, ich bin jedoch nicht in der Lage, den Array-Teil in die Funktion einzufügen.

Wie kann ich die Abhängigkeit von 'n' in der Anweisungsfunktion aushandeln? Ich versuche so etwas wie das Folgende, bin aber noch nicht ganz da.

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 

Jede Hilfe würde sehr geschätzt werden.

Antwort

0

Dies ist ein erweiterter und formatierter Kommentar und keine Antwort.

Der allgemeine Hinweis mit Anweisung Funktionen in modernen Fortran ist Do not, nur nicht. Sie sind nicht groß und sie sind nicht schlau. Sie waren auch veraltet in, ich denke, der Fortran 90-Standard, also, um pedantisch zu sein, sind Ihre Anforderungen inkonsistent.

Darüber hinaus ist es schwierig, spezifische Ratschläge zu geben. Wenn ich das Matlab richtig verstehe, ist der Code, den du zeigst, ein verschachtelter Weg, um 5+3*1+3*2+...+3*5 zu berechnen. In Fortran 90 könnten Sie schreiben

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

, um das zu berechnen.

Vielleicht, wenn wir mehr über den Kontext Ihres Problems wüssten, wären wir in der Lage, Sie besser zu beraten.

0

Ich erkannte, dass Aussagefunktionen im modernen Fortran nicht der richtige Weg sind. Stattdessen habe ich Unterprogramme für die Funktionen erstellt und diese dann in der Schleife aufgerufen. Auf diese Weise können alle Werte der Funktion in der Schleife in ein Array (anstatt nur der letzten Werte) eingefügt werden. Das richtige Stück Code sieht so aus:

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

Beachten Sie den ganzen Zweck von diesem ist, das gleiche Format für kompliziertere Funktionen zu verwenden, die ein Schmerz sind, um millionenmal zu schreiben. –

Verwandte Themen