Passare tipo derivato come matrice
-
26-10-2019 - |
Domanda
In FORTRAN, si può operare su array, ma come si può trattare gli indici di un tipo derivato come parte di un array troppo? Codice spiegherebbe quello che voglio fare meglio:
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)
ho pensato che la riga finale è analoga ad una matrice 2x4 moltiplicando con se stesso. Tuttavia, quando provo a compilare, gfortran lamenta ??p>
Errore: Due o più riferimenti parte con rango diverso da zero non devono essere specificati
Questo è possibile fare in Fortran?
Soluzione
Si desidera che il compilatore di riguardo mat(:)%c
come matrice 2 x 4? Non funziona in questo modo. mat
e c
sono diversi oggetti e loro ranghi non si fondono in un singolo array. mat
è un tipo definito dall'utente e c
è una matrice reale. Solo perché si sta utilizzando solo il c
-componente del mat
non significa che il compilatore promuoverà c
a una matrice vera e propria dimensione superiore, in base alla dimensione della mat
.
Si potrebbe creare un nuovo array tramite X = [ mat(1)%c, mat(2)%c ]
. Si potrebbe utilizzare reshape
per controllare la forma.
Altri suggerimenti
Non puoi moltiplicare le matrici non quadrati da soli. È necessario trasporre uno di loro.
È anche mescolare reali e interi. I suoi matrici dovrebbero essere reale e il risultato è intero.
È possibile specificare la matrice con un piccolo trucco STYLE FORTRAN (equivalenza e sequenza, assumendo stessa dimensione di archiviazione per intero predefinito e reale). Questo uno compila:))))
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