2012-03-06 76 views
1

這是我的計劃處理多個矩陣

program matrix 
real :: J1(38,38),J2(38,29),J3(29,38),J4(29,29) 
real :: J13(38,1),J23(29,1),J33(1,68),Jac(68,68) 
!!all matrices contains some values except Jac 

Jac=[J1 J2 J13 
    J3 J4 J23 
    J33  ] 
end program matrix 

現在我希望把所有這些矩陣爲1點矩陣江淮汽車(68,68) 使江淮= [J1 J2 J13 J3 J4 J23 J33] 什麼應該是fortran代碼..請幫助我。

+2

使用2 DO-循環(嵌套)遍歷江淮的要素和指標偏移把每個元素從J1..J33到江淮其corresponging地方。 – milancurcic 2012-03-06 18:10:48

+0

你在做什麼?某種(從名稱J中猜測)振動分析 - 加強筋矩陣? – Rook 2012-03-06 22:41:57

回答

1

您需要遍歷Jac並將Jx(.,.)的元素分配給Jac(i,j)。例如,你這是怎麼分配給J1最左邊Jac上部區段:

DO i = 1, 38 
    DO j = 1, 38 
    Jac(i,j) = J1(i,j) 
    END DO 
END DO 
10

或者,如果你不喜歡寫循環,你可以寫;

Jac(1:38,1:38) = J1 
Jac(1:38,39:38+29) = J2 

等等。

編輯

我無法從你貼什麼,如果此位將有興趣知道,但我推斷Fortran語言知識的水平,這不包括此...

你可以定義:

real, target :: jac(68,68) 
real, dimension(:,:), pointer :: j1, j2, j3, j4, j13, j23, j33 

,並使用這些子排列是這樣的:

j1 => jac(1:38,1:38) 
j33 => jac(1,:) 

。這樣你在內存中只有一個數據副本,對於這樣的小型陣列可能並不重要。如果子陣列和超級陣列的內容應該不同,那就是錯誤的方法。

3

爲了更簡潔一點,你也可以使用

JAC(1:38, 1:38) = J1 (1:38,1:38) 
JAC(1:38,39:67) = J2 (1:38,1:29) 
JAC(1:38, 68) = J13(1:38, 1) 
JAC(39:67, 1:38) = J3 (1:29,1:38) 
JAC(39:67,39:67) = J4 (1:29,1:29) 
JAC(39:67, 68) = J23(1:29, 1) 
JAC( 68, 1:68) = J33( 1,1:68) 

如果你有更大的陣列,其中複製可能不是一個好主意,我建議你寫的自動轉換索引的功能。爲了好玩,我添加了一個包含所有子矩陣的自定義類型MATRIX,但未在下面明確指定它。所以,你必須

REAL FUNCTION JAC(I,J, JAC_MAT) 
    INTEGER, INTENT(IN) :: I,J 
    TYPE(MATRIX), INTENT(IN) :: JAC_MAT 
    IF(I.LE.38.AND.J.LE.38)THEN 
    JAC = JAC_MAT%J1(I,J) 
    ELSEIF(I.LE.38.AND.J.LE.67)THEN 
    JAC = JAC_MAT%J2(I,J-38) 
    ... 
    ENDIF 
END FUNCTION