You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:47:07