Fortran - 建構函式



下表描述了建構函式

函式 描述
merge(tsource, fsource, mask) 此函式連線兩個陣列。如果 mask 中的條件為 .true.,則它給出 tsource 中的元素;如果 mask 中的條件為 .false.,則給出 fsource 中的元素。兩個欄位 tsource 和 fsource 必須具有相同的型別和相同的形狀。結果也具有此型別和形狀。此外,mask 必須具有相同的形狀。
pack(array, mask, vector) 它在 mask 的控制下將陣列打包到向量中。邏輯陣列 mask 的形狀必須與陣列的形狀一致,否則 mask 必須是標量。如果包含 vector,它必須是秩為 1(即向量)的陣列,其元素至少與 mask 中為真的元素一樣多,並且與陣列具有相同的型別。如果 mask 是值為 .true. 的標量,則 vector 必須具有與陣列相同數量的元素。
spread(source, dim, ncopies) 它返回一個與引數 source 型別相同的陣列,其秩增加一。引數 dim 和 ncopies 為整數。如果 ncopies 為負數,則改為使用零。如果 source 是標量,則 spread 變為一個向量,其中包含 ncopies 個元素,所有這些元素都與 source 的值相同。引數 dim 指示要擴充套件哪個索引。它必須在 1 和 1+(source 的秩) 之間,如果 source 是標量,則 dim 必須為 1。引數 ncopies 是新維度中元素的數量。
unpack(vector, mask, array)

它在 mask 的控制下將向量分散到陣列中。邏輯陣列 mask 的形狀必須與陣列的形狀一致。陣列 vector 必須具有秩 1(即它是一個向量),其元素至少與 mask 中為真的元素一樣多,並且還必須與陣列具有相同的型別。如果 array 給定為標量,則將其視為與 mask 形狀相同且在所有位置都具有相同標量元素的陣列。

結果將是一個與 mask 形狀相同且與 vector 型別相同的陣列。值將是來自 vector 的那些被接受的值,而在陣列中的其餘位置將保留舊值。

示例

以下示例演示了該概念

program arrayConstruction
implicit none
   interface
      subroutine write_array (a)
         real :: a(:,:)
      end subroutine write_array
      
      subroutine write_l_array (a)
         logical :: a(:,:)
      end subroutine write_l_array
   end interface

   real, dimension(2,3) :: tsource, fsource, result
   logical, dimension(2,3) :: mask
   
   tsource = reshape( (/ 35, 23, 18, 28, 26, 39 /), &
                    (/ 2, 3 /) )
   fsource = reshape( (/ -35, -23, -18, -28, -26, -39 /), &
                    (/ 2,3 /) )
   mask = reshape( (/ .true., .false., .false., .true., &
                 .false., .false. /), (/ 2,3 /) )

   result = merge(tsource, fsource, mask)
   call write_array(tsource)
   call write_array(fsource)
   call write_l_array(mask)
   call write_array(result)
   
end program arrayConstruction



subroutine write_array (a)

   real :: a(:,:)
   do i = lbound(a,1), ubound(a,1)
      write(*,*) (a(i, j), j = lbound(a,2), ubound(a,2) )
   end do
   return
   
end subroutine write_array


subroutine write_l_array (a)

   logical :: a(:,:)
   do i = lbound(a,1), ubound(a,1)
      write(*,*) (a(i, j), j= lbound(a,2), ubound(a,2))
   end do
   return
   
end subroutine write_l_array

當以上程式碼編譯並執行時,會產生以下結果

35.0000000   18.0000000   26.0000000    
23.0000000   28.0000000   39.0000000    
-35.0000000  -18.0000000  -26.0000000    
-23.0000000  -28.0000000  -39.0000000    
T F F
F T F
35.0000000   -18.0000000  -26.0000000    
-23.0000000  28.0000000   -39.0000000    
fortran_arrays.htm
廣告

© . All rights reserved.