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

Errore: Due o più riferimenti parte con rango diverso da zero non devono essere specificati

Questo è possibile fare in Fortran?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top