我很努力想出輸出3D陣列的算法。我基本上有9個二維數組陣列,我需要將它們組合成一個3X3網格並作爲矩陣輸出到文本文件中。 所以我有:用於輸出3D陣列的算法
real:: array3D(9,16,16)
,我需要順序(從左至右,從上至下)把這些9,16×16陣列彙集成一個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
,但我只對每個塊中的16x16
塊感興趣(9個數獨謎題,一個子網格從每個)我想要哪個16x16塊是由第一個索引complete
/array3D
:1-9定義的,我想將這些子塊排列在另一個48x48
數組中,如arrayOut
/array2D
)。如果我寫的東西沒有什麼意義,我會試着把這個問題的圖形化解釋說出來。
由於@george,其答案是下面,把這種在一個數組,你需要:
do majorRow=1,3
do majorCol=1,3
subBlock=(majorRow-1)*3+majorCol
do minorRow=majorRow*16-(16-1),majorRow*16
do minorCol=majorCol*16-(16-1),majorCol*16
outArray(minorRow,minorCol)=complete(subBlock,minorRow,minorCol)
end do
end do
end do
end do
看看fortran的「做循環」。 – mbeckish
我知道它需要一個循環,最有可能是一個三重嵌套。它的環路邊界條件我正在努力。 – user2538235
邊界條件取決於3x3的組織方式以及目標陣列中的48是按行(3x16)還是按列(16x3)組織的。然後,您可以在原始數組的三個維度上循環,並將這些元素置於目標矩陣中,或者可以遍歷目標矩陣的兩個維度並從源數據中獲取元素。指數如何計算取決於你想要的佈局。 –