Pregunta

En Fortran, uno puede operar en matrices, pero ¿cómo se puede tratar los índices de un tipo derivado como parte de una matriz también? El código explicaría lo que quiero hacer mejor:

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)

Asumí que la línea final es análoga a una matriz 2x4 que se multiplica consigo misma. Sin embargo, cuando trato de compilar, Gfortran se queja

Error: no se deben especificar dos o más referencias de piezas con rango distinto de cero

¿Es esto posible hacer en Fortran?

¿Fue útil?

Solución

Quieres que el compilador considere mat(:)%c como una matriz de 2 x 4? No funciona de esa manera. mat y c son objetos diferentes y sus filas no se fusionan en una sola matriz. mat es un tipo definido por el usuario y c es una matriz real. Solo porque solo estás usando el c-componente de mat no significa que el compilador promovará c a una matriz real dimensional más alta, basada en la dimensión de mat.

Podrías crear una nueva matriz a través de X = [ mat(1)%c, mat(2)%c ]. Podrías usar reshape para controlar la forma.

Otros consejos

No pueden multiplicar las matrices no cuadradas por sí mismas. Tienes que transponer uno de ellos.

También mezclas reales e enteros. Se supone que sus matrices son reales y su resultado es entero.

Es posible hacer referencia a la matriz con un pequeño hack de estilo Fortran (equivalencia y secuencia, suponiendo el mismo tamaño de almacenamiento para el entero predeterminado y el real). Este 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top