Matrix fortran程序中多矩阵的处理

Matrix fortran程序中多矩阵的处理,matrix,fortran,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个矩阵

这是我的节目

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 J3J4J23 [J33]
fortran代码应该是什么。请帮助我。

您需要迭代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

您需要迭代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

或者,如果你不喜欢写循环,你可以写

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,:)

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

或者,如果你不喜欢写循环,你可以写

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,:)

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

更简洁地说,您也可以使用

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

简而言之,您还可以使用

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个DO循环(嵌套)在Jac的元素上迭代,并索引偏移量,将J1..J33中的每个元素放入Jac中对应的位置。您对此做了什么?某种振动分析(根据名称J猜测)-加劲杆矩阵?使用2个DO循环(嵌套)迭代Jac的元素,并索引偏移量,将J1..J33中的每个元素放在Jac中对应的位置。你用这个做什么?某种类型的(从名称J猜)振动分析-加劲肋矩阵?