2014-01-09 80 views
0

我很努力想出輸出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 
+0

看看fortran的「做循環」。 – mbeckish

+0

我知道它需要一個循環,最有可能是一個三重嵌套。它的環路邊界條件我正在努力。 – user2538235

+0

邊界條件取決於3x3的組織方式以及目標陣列中的48是按行(3x16)還是按列(16x3)組織的。然後,您可以在原始數組的三個維度上循環,並將這些元素置於目標矩陣中,或者可以遍歷目標矩陣的兩個維度並從源數據中獲取元素。指數如何計算取決於你想要的佈局。 –

回答

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,:) 

代替你仍然需要,因爲沒有提前每行有三個寫入。

+0

我可以看到並理解這是如何工作的,並且感謝這就是我所要求的。但是,如果我確實想將其放入數組中以便進行其他操作,我將如何使其工作。只需將第6行更改爲'outArray(minorRow,minorCol)= complete(subBlock,minorRow,minorCol)'就可以將所有內容放入第一個子塊中。 – user2538235

+0

我現在已經做了這件事,在帖子中添加了代碼。再次感謝 – user2538235

0

如果採取簡單的do循環結構,你只需要循環的大型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數組的排序效率不高。優選地,它應該是最後一個索引(避免緩存未命中)。