处理fortran程序中的许多矩阵

时间:2012-03-06 18:02:39

标签: matrix fortran

这是我的程序

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矩阵Jac(68,68) 所以Jac = [J1 J2 J13              J3 J4 J23              J33] 什么应该是fortran代码..请帮助我。

3 个答案:

答案 0 :(得分: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,:)

。这样,内存中只有一个数据副本,对于这样的小数组可能无关紧要。如果子数组和超级数组的内容应该不同,那么这是错误的方法。

答案 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

答案 2 :(得分: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