Fortran 90/95中如何将多个子矩阵组合成主数组E?
在Fortran 90/95中构造分块主数组E
我懂你想要的效果——像Matlab里那样轻松把几个小矩阵拼合成一个大的分块数组E对吧?确实Fortran没有Matlab那种[A B; C D]的简洁语法,但用数组切片(slice)完全能实现你要的结果。
先看你期望的E矩阵结构:
E = [1 1 1 2 1 2 0 0 1 1 1 1 0 0 1 3]
这本质是把四个子块放在4x4数组的对应位置,空缺的地方补0。下面是修改后的代码,完全符合你的需求:
Program array1 !*************************************************! implicit none INTEGER, PARAMETER :: m=2 !rows INTEGER, PARAMETER :: n=2 !cols Real, DIMENSION(m,n) :: A,D Real, DIMENSION(1,2) :: B,C REAL, allocatable,DIMENSION(:,:) :: E allocate(E(4,4)) E = 0.0 ! 先把整个数组初始化0,省去手动补0的麻烦 ! 给子矩阵赋值 A(1,:)=(/ 1, 1 /) A(2,:)=(/ 1, 2/) B(1,:)=(/ 1, 2/) C(1,:)=(/ 1, 1 /) D(1,:)=(/ 1, 1 /) D(2,:)=(/ 1, 3 /) ! 用数组切片填充E的各个分块 E(1:2, 1:2) = A ! 左上角2x2的A E(1, 3:4) = B ! 右上角第一行的B,第二行已经是0 E(3, 1:2) = C ! 左下角第三行的C,第四行已经是0 E(3:4, 3:4) = D ! 右下角2x2的D ! 按行打印,结果更易读 print *, "构造好的E矩阵:" print "(4F6.1)", E(1,:) print "(4F6.1)", E(2,:) print "(4F6.1)", E(3,:) print "(4F6.1)", E(4,:) End program array1
关键思路说明:
- 数组初始化:先把E全部设为0,这样那些不需要手动赋值的位置(比如B的第二行、C的第二列)自动就是0,不用额外处理。
- 切片赋值:Fortran的数组切片语法
E(start_row:end_row, start_col:end_col)可以精准定位子块的位置,直接把小矩阵的值赋值进去,这是Fortran里处理分块数组最直接的方式。 - 可读性优化:最后按行打印,比直接
print *,E输出一串数字更直观,能清晰看到矩阵的结构。
如果你以后遇到子块大小不固定的情况,还可以用循环或者动态计算切片范围,但这个例子里固定大小的场景,直接用切片就足够简单高效了。
内容的提问来源于stack exchange,提问作者Nobody
相关产品推荐
相关产品推荐

