在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中完成吗?
答案 0 :(得分:8)
您希望编译器将mat(:)%c
视为2 x 4矩阵吗?它不起作用。 mat
和c
是不同的对象,它们的等级不会合并为单个数组。 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