如何将20x20矩阵转换为25个4x4矩阵?

时间:2016-03-09 09:05:47

标签: matrix fortran

   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矩阵。

1 个答案:

答案 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