将派生类型作为数组传递

时间:2012-01-11 04:44:29

标签: arrays fortran derived-types

在Fortran中,可以对数组进行操作,但是如何将派生类型的索引视为数组的一部分呢?代码将解释我想要做的最好的事情:

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)

我假设最后一行类似于2x4矩阵与自身相乘。但是,当我尝试编译时,gfortran抱怨

  

错误:不得指定具有非零等级的两个或多个零件参考

这可以在Fortran中完成吗?

2 个答案:

答案 0 :(得分:8)

您希望编译器将mat(:)%c视为2 x 4矩阵吗?它不起作用。 matc是不同的对象,它们的等级不会合并为单个数组。 mat是用户定义的类型,c是一个真实的矩阵。仅仅因为您只使用c的{​​{1}}组件并不意味着编译器会根据mat的维度将c提升为更高维度的实数组

您可以通过mat创建新数组。您可以使用X = [ mat(1)%c, mat(2)%c ]来控制形状。

答案 1 :(得分:3)

你不能自己乘以非方形矩阵。你必须转置其中一个。

您还可以混合实数和整数。你的矩阵应该是真实的,你的结果是整数。

可以使用小的FORTRAN STYLE hack(等价和序列,假设默认整数和实数的存储大小相同)来引用矩阵。这个编译:)))))

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