我正在努力想出一个输出3D数组的算法。我基本上有一个9个2D阵列的阵列,我需要将它组合成一个3X3网格,并作为矩阵输出到文本文件中。 所以我有:
real:: array3D(9,16,16)
我需要按顺序(从左到右,从上到下)将这些9,16x16阵列组合成3x3网格:
real:: array2D(48,48)
任何帮助都会很棒。
[编辑:评论信息]: 这是MPI程序的一部分,其中48x48矩阵被分成9个16x16矩阵,其中9个进程中的每一个被分配给较大阵列的一个“子网格”。像评论中提到的数独网格一样,每个进程将公式应用于其自己的子网格中的每个元素。然后,需要将每个过程计算的最终值放回到48x48矩阵中,以便显示在文本文件中。目前看起来像这样:
if(procID.ne.0)then!Send all arrays to root
call MPI_SEND (array, row*col, MPI_REAL, 0, procID+1000, MPI_COMM_WORLD, ierr)
else
complete(1,:,:)=array(:,:)
do i=2, 9
call MPI_RECV (recvArray, row*col, MPI_REAL, i-1, (i-1)+1000, MPI_COMM_WORLD, status, ierr)
complete(i,:,:)=recvArray
end do
我想要得到的是一种算法,我可以用它来显示文本文件中的complete
作为矩阵,这样我就可以阅读。 (我知道变量名称与上面的不同,但我尽可能地简化/概括了我原来的问题。array
再次有维度48x48
,但我只对{{1}感兴趣每个块内的块(9个数独谜题,只需要每个子网格)我想要的16x16块由16x16
/ complete
的第一个索引定义:1-9,我想要获取这些子块并将它们排列在另一个array3D
数组中,说48x48
/ arrayOut
)。如果我写的东西没有多大意义,我会尝试对问题进行图解说明。
感谢@george的答案如下,将其放入您需要的数组中:
array2D
答案 0 :(得分:1)
无需复制到新阵列即可输出。
伪代码:(我可能已经转换了行/列,但很容易修复)
do majorrow=1,3
do minorrow=1,16
do majorcol=1,3
subblock=(majorrow-1)*3+majorcol
do minorcol=1,16
write(advance=no)array3D(subblock,minorrow,minorcol)
enddo
enddo !end of row
write() ! to advance line at end of row.
enddo
enddo
请注意,最里面的循环可以替换为
write(advance=no)array3D(subblock,minorrow,:)
由于每行有三次写入,因此您仍然无需提前。
答案 1 :(得分:0)
如果你采用简单的do-loop结构,你只需要以块方式循环遍历大的2d数组,然后将3d数组中的相应元素存储在2d数组的正确块中。
BLKSZ=16
NBLOCK=3
DO IB=1,NBLOCK
ISTA=BLKSZ*(IB-1)+1
IEND=ISTA+BLKSZ-1
DO JB=1,NBLOCK
JSTA=BLKSZ*(JB-1)+1
JEND=JSTA+BLKSZ-1
array2D(ISTA:IEND,JSTA:JEND)=array3D(JB+NBLOCK*(IB-1),:,:)
END DO
END DO
请注意,3d数组的排序效率不高,因为块索引是最快的索引。最好是它应该是最后一个索引(避免缓存未命中)。