0

Ich schreibe ein Programm, das die LU-Dekomposition einer Matrix mit partieller Pivotisierung berechnet und möchte, dass die Funktion mehrere (2 oder 3) Matrizen ausgibt, ohne das Programm mehrmals auszuführen, um jedes einzeln auszugeben, was a ist Zeitverschwendung, da es mir alles bringt, was ich will. Gibt es eine Möglichkeit, dies zu tun? Zum Beispiel ist hier meine Funktion, die den Algorithmus von Doolittle verwendet, für die quadratische Matrix, die nicht geschwenkt werden muss. Ich möchte, dass meine Ausgabe gleichzeitig Matrix und Du ist, aber ich weiß keine Möglichkeit, das zu tun.Wie man 2 oder mehr Felder in einer Fortran-Funktion ausgibt?

function lu_d(aa) result(l) 

real, dimension (:,:) :: aa !input matrix 
real, dimension (size(aa,1), size(aa,2)) :: a !keeping input variable intact 
real, dimension (size(a,1), size(a,2)) :: l , u !lower and upper matrices 
integer :: i,j,k !index 
real :: s !auxiliar variable 

a=aa 

do j=1 , size(a,2) 
    u(1,j)=a(1,j) 
end do 

l(1,1)=1 

do j=2, size(a,2) 
    l(1,j)=0 
end do 

do i=2, size(a,1) 

    l(i,1)=a(i,1)/u(1,1) 
    u(i,1)=0 

    do j=2, i-1 

    s=0 
    u(i,j)=0 

    do k=1, j-1 
     s=s+l(i,k)*u(k,j) 
    end do 

    l(i,j)=(a(i,j)-s)/u(j,j) 

    end do 

    l(i,i)=1 

    do j=i, size(a,2) 

    s=0 
    l(i,j)=0 

    do k=1, i-1 
     s=s+l(i,k)*u(k,j) 
    end do 

    u(i,j)=a(i,j)-s 

    end do 

end do 

end function 
+0

Verwenden Sie immer tag [tag: Fortran]. Fügen Sie zur Unterscheidung eine bestimmte Version hinzu. Nur eine sehr kleine Anzahl von Leuten folgen [Tag: Fortran95]. –

+0

Natürlich gibt es eine Möglichkeit, so etwas zu tun, aber Sie sollten sich etwas Mühe geben. Wie sieht dein Code aus? Welche Probleme hast du? –

+0

Ich suche online nach Informationen, aber ich habe nichts darüber gefunden. Ich werde den Beitrag bearbeiten und meinen Code hinzufügen! Einen Augenblick. –

Antwort

1

Sie können von der Verwendung einer Funktion zur Verwendung eines Unterprogramms wechseln. Auf diese Weise können Sie Werte für mehrere Arrays in der Argumentenliste ausgeben. Zusätzlich mit der INTENT Definition, wenn Variablen in dem Unterprogramm erklärt, zum Beispiel:

REAL,INTENT(IN)::a a erklärt und erlaubt es nicht, seine Werte in dem Unterprogramm/Funktion

REAL,INTENT(OUT)::b erklärt b geändert werden und ignoriert alle Werte es kommt hat in das Unterprogramm/Funktion

REAL,INTENT(INOUT)::c Dies ist der Fall standardmäßig, wenn Sie nichts schreiben.

Ich nehme an, Sie müssen die Ausgabe l und u (statt m), in diesem Fall würde die Struktur etwa wie die unten aussehen. Beachten Sie, dass l und m entweder im Hauptprogramm deklariert sein sollten und ihre Größe in Bezug auf aa (wie im ersten Fall unten dargestellt) ODER mit einer allocatable Größe im Hauptprogramm definiert sein muss, die an das Unterprogramm ohne Zuweisung und Zuweisung übergeben wird innerhalb des Unterprogramms (zweites Beispiel). Letzteres erfordert möglicherweise, dass Sie das Unterprogramm in ein Modul einfügen, damit die Schnittstellen ordnungsgemäß behandelt werden.

Erstes Beispiel:

SUBROUTINE lu_d(aa,l,m) 
implicit none 
real,intent(in):: a(:,:) 
real,intent(out):: l(:,:), m(:,:) 
integer:: i,j,k 
real:: s 

<operations> 

RETURN 
END SUBROUTINE lud_d 

Zweites Beispiel:

SUBROUTINE lu_d(aa,l,m) 
implicit none 
real,intent(in):: a(:,:) 
real,allocatable,intent(out):: l(:,:), m(:,:) 
integer:: i,j,k,size_a1,size_a2 
real:: s 

size_a1=size(aa,1) 
size_a2=size(aa,2) 
allocate(l(size_a1,size_a2), m(size_a1,size_a2)) 

<operations> 

RETURN 
END SUBROUTINE lud_d 
+0

Vielen Dank all ^^ –

+0

Überraschenderweise mache ich das nicht ... Aber kann eine Funktion eine Struktur zurückgeben? Wenn das so ist, könnte es eine Struktur mit den beiden Arrays zurückgeben, aber das Unterprogramm scheint einfacher zu sein ... Wahrscheinlich mache ich diese Dinge so. – Holmz

+0

Das ist ein guter Punkt, technisch könnte man auch eine Matrix ausgeben, die 'l' und' m' mit dem Funktionsansatz enthält, aber dann müssten Sie diese später trennen. Erklären des Ergebnisses der Funktion als z.B. 'A (Größe (aa, 1), Größe (aa, 2), 2)' und dann mit 'A (:,:, 1) = l; A (:,:, 2) = m 'sollte es tun, aber Sie können die Unannehmlichkeiten sehen. – ptev