Fortran-manipulation

提供:Dev Guides
移動先:案内検索

Fortran-操作関数

操作関数はシフト関数です。 シフト関数は、配列の形状を変更せずに返しますが、要素を移動します。

Sr.No Function & Description
1

cshift(array, shift, dim)

シフトが正の場合は左へ、シフトが負の場合は右へのシフト位置によって循環シフトを実行します。 配列がベクトルの場合、シフトは自然な方法で行われ、それがより高いランクの配列である場合、シフトは次元dimに沿ったすべてのセクションにあります。 dimが欠落している場合、1と見なされます。他の場合は、1からn(nは配列のランクに等しい)の間のスカラー整数でなければなりません。 引数シフトは、次元dim(これはランクが低いために削除されます)を除いて、スカラー整数またはランクn-1の整数配列で、配列と同じ形状です。 したがって、さまざまなセクションをさまざまな方向に、さまざまな数の位置でシフトできます。

2

eoshift(array, shift, boundary, dim)

エンドオフシフトです。 シフトが正の場合は左にシフトし、負の場合は右にシフトします。 シフトアウトされた要素の代わりに、新しい要素が境界から取得されます。 配列がベクトルの場合、シフトは自然な方法で行われ、より高いランクの配列の場合、すべてのセクションのシフトは次元dimに沿っています。 dimが欠落している場合、1と見なされます。他の場合は、1からn(nは配列のランクに等しい)の間のスカラー整数値を持つ必要があります。 配列のランクが1の場合、引数shiftはスカラー整数です。他の場合は、スカラー整数またはランクn-1の整数配列で、次元dim(削除される次元ランクが低いため)。

3

transpose (matrix)

ランク2の配列である行列を転置します。 マトリックスの行と列を置き換えます。

次の例は、概念を示しています-

program arrayShift
implicit none

   real, dimension(1:6) :: a = (/21.0, 22.0, 23.0, 24.0, 25.0, 26.0/)
   real, dimension(1:6) :: x, y
   write(*,10) a

   x = cshift ( a, shift = 2)
   write(*,10) x

   y = cshift (a, shift = -2)
   write(*,10) y

   x = eoshift ( a, shift = 2)
   write(*,10) x

   y = eoshift ( a, shift = -2)
   write(*,10) y

   10 format(1x,6f6.1)

end program arrayShift

上記のコードをコンパイルして実行すると、次の結果が生成されます-

21.0  22.0  23.0  24.0  25.0  26.0
23.0  24.0  25.0  26.0  21.0  22.0
25.0  26.0  21.0  22.0  23.0  24.0
23.0  24.0  25.0  26.0   0.0   0.0
0.0    0.0  21.0  22.0  23.0  24.0

次の例は、行列の転置を示しています-

program matrixTranspose
implicit none

   interface
      subroutine write_matrix(a)
         integer, dimension(:,:) :: a
      end subroutine write_matrix
   end interface

   integer, dimension(3,3) :: a, b
   integer :: i, j

   do i = 1, 3
      do j = 1, 3
         a(i, j) = i
      end do
   end do

   print *, 'Matrix Transpose: A Matrix'

   call write_matrix(a)
   b = transpose(a)
   print *, 'Transposed Matrix:'

   call write_matrix(b)
end program matrixTranspose


subroutine write_matrix(a)

   integer, dimension(:,:) :: a
   write(*,*)

   do i = lbound(a,1), ubound(a,1)
      write(*,*) (a(i,j), j = lbound(a,2), ubound(a,2))
   end do

end subroutine write_matrix

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Matrix Transpose: A Matrix

1  1  1
2  2  2
3  3  3
Transposed Matrix:

1  2  3
1  2  3
1  2  3