Frage

In Forran kann man auf Arrays arbeiten, aber wie kann man die Indizes eines abgeleiteten Typs auch als Teil eines Arrays behandeln? Code würde erklären, was ich am besten kann:

type mytype
    integer :: b(3,3)
    real :: c(4)
endtype

integer :: a(3,3)
real :: d(2,4)
type(mytype) :: mat(2)

!do stuff so that 'mat' gets values
....

!usually one does this
a = matmul(mat(1)%b, transpose(mat(2)%b))

!multiplying two 3x3 matrices

!but how does one do this? Note the "array"
d = matmul(mat(:)%c, mat(:)%c)

Ich nahm an, dass die endgültige Zeile analog zu einer 2x4 -Matrix ist, die mit sich selbst multipliziert wird. Wenn ich jedoch versuche zu kompilieren, beschwert sich Gfortran

Fehler: Zwei oder mehr Teilreferenzen mit Rang ungleich Null dürfen nicht angegeben werden

Ist das in Forran möglich?

War es hilfreich?

Lösung

Sie möchten, dass der Compiler berücksichtigt wird mat(:)%c als 2 x 4 Matrix? Es funktioniert nicht so. mat und c sind verschiedene Objekte und ihre Ränge verschmelzen nicht zu einem einzigen Array. mat ist ein benutzerdefinierter Typ und c ist eine echte Matrix. Nur weil Sie nur die verwenden c-Teil von mat bedeutet nicht, dass der Compiler fördern wird c zu einem höherdimensionalen realen Array, basierend auf der Dimension von mat.

Sie können ein neues Array über über die Erstellung eines neuen Arrays übernehmen X = [ mat(1)%c, mat(2)%c ]. Du könntest benutzen reshape die Form steuern.

Andere Tipps

Sie können keine Nonsquare -Matrizen selbst multiplizieren. Sie müssen einen von ihnen übertragen.

Sie mischen auch Real und Ganzzahlen. Ihre Matrizen sollen real sein und Ihr Ergebnis ist ganzzahlig.

Es ist möglich, die Matrix mit einem kleinen FORTRAN -HACK (Äquivalenz und Sequenz zu verweisen, unter deren gleiche Speichergröße für die Standardgülle und Real). Dieser kompiliert :))))

type mytype
    !!!
    sequence
    integer :: b(3,3)
    real :: c(4)
endtype

integer :: a(3,3)
real :: d(4,4)

type(mytype) :: mat(2)
real,dimension(13,2) :: newmat

!!!
equivalence (mat,newmat)

!do stuff so that 'mat' gets values
! ....

!usually one does this
a = matmul(mat(1)%b, mat(2)%b)

!multiplying two 3x3 matrices

!but how does one do this? Note the "array"
 d = matmul(reshape(newmat(10:13,:),(/4,2/)),transpose(reshape(newmat(10:13,:),(/4,2/))))

end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top