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猜)振动分析-加劲肋矩阵?