program oned_array
implicit none
integer i,j,k,seed,n,l
parameter(n=10)
real r0(n),s1(n)
real m
seed=4965817
!____________生成1d数组_________
do i=1,n
r0(i)=ran(seed)
write(20,*)r0(i)
enddo
k=1
l=n/5
do i=1,5
m=0
do j=k,l
s1(i)=r0(j)
m=m+s1(i)
write(21,*)i,j,s1(i)
enddo
k=l+1
l=l+n/5
write(22,*)i,m
enddo
stop
end
我认为这适用于一维数组。 但是如何处理矩阵?
m
是我想为每个子阵列计算的数量。
n是较旧的矩阵维度,即10.(10x10矩阵) M是我想要计算的东西 这会将旧矩阵转换为2 * 2矩阵,对于每个矩阵,我得到m。 五个2 * 2矩阵。
答案 0 :(得分:1)
直接使用切片提取子矩阵。
program sub_mat
! Better use 'allocatable' instead
integer, parameter :: nx = 20, ny = 20, sx = 4, sy = 4
integer, dimension(nx, ny) :: mat
integer, dimension(sx, sy) :: submat
integer :: i, j
! Initialize
mat = reshape( [ ((i+j, i = 1, nx), j = 1, ny) ], [nx, ny] )
! Access sx-by-sy blocks (submatrices)
do i = 1, nx, sx
do j = 1, ny, sy
submat = mat(i:i+sx, j:j+sy)
! Now you can do what is needed with 'submat'
end do
end do
end program sub_mat
打印子矩阵以供审核(位于上方submat = ...
行下方)
write(*,'(a,2(i2,a1))') 'at (', i, ',', j, ')'
do m = 1, sx
do n = 1, sy
write(*, '(i4)', advance='no') submat(m,n)
end do
write(*, *)
end do
输出,为空间编辑
at ( 1, 1) 2 3 4 5 3 4 5 6 4 5 6 7 5 6 7 8 ... at ( 5, 9) 14 15 16 17 15 16 17 18 16 17 18 19 17 18 19 20 ... at (17,17) 34 35 36 37 35 36 37 38 36 37 38 39 37 38 39 40
下一个学习步骤是使用reshape
代替工作。它是一种功能更强大的高级工具,可用于各种任务。
这是一项更为严肃的工作,但这是一种开始的方式。
请注意,上面的简单用法,初始化矩阵,也是一种解决问题的方法。
有关此示例的完整讨论(初始化矩阵),请参阅this SO post。