2012-01-11 25 views
2

在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抱怨

Error: Two or more part references with nonzero rank must not be specified

Fortran中可以這樣做嗎?

回答

8

您希望編譯器將mat(:)%c視爲2 x 4矩陣?它不這樣工作。 matc是不同的對象,它們的排名不會合併到單個數組中。 mat是用戶定義的類型,c是一個真正的矩陣。僅僅因爲您只使用c- mat的組件,並不意味着編譯器會根據mat的維度將c提升爲更高維的實數組。您可以通過X = [ mat(1)%c, mat(2)%c ]創建一個新的數組。您可以使用reshape來控制形狀。

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 
+0

這看起來完全髒 – steabert 2012-01-11 09:38:18

+0

的Fortran程序員必須做好準備,找到類似的事情在傳統的代碼:)。儘管如此,前兩個消息更重要,仍然適用。代碼只是爲了好玩。 – 2012-01-11 09:42:53

+0

感謝您指出錯誤。我修復了它們。但問題的核心仍然是一樣的。 – 2012-01-11 10:23:57