2012-03-06 77 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