这是我的程序
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代码..请帮助我。
答案 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