Arrays 数组中的Fortran数组

Arrays 数组中的Fortran数组,arrays,matrix,fortran,cell,fortran90,Arrays,Matrix,Fortran,Cell,Fortran90,我想获得一个数组,但此数组包含更多数组。我将用一个例子来描述!我想创建4个矩阵。主矩阵是E Program array1 !*************************************************! implicit none INTEGER, PARAMETER :: m=2 !rows INTEGER, PARAMETER :: n=2 !cols Real, DIMENSION(m,n) :: A,D Real, DI

我想获得一个数组,但此数组包含更多数组。我将用一个例子来描述!我想创建4个矩阵。主矩阵是E

   Program array1
   !*************************************************! 
   implicit none

   INTEGER, PARAMETER :: m=2 !rows
   INTEGER, PARAMETER :: n=2 !cols
   Real, DIMENSION(m,n) :: A,D
   Real, DIMENSION(1,2) :: B,C

   REAL, allocatable,DIMENSION(:,:) :: E
   allocate(E(4,4))
   ! Assign values to the matrix
   A(1,:)=(/ 1,  1 /)   
   A(2,:)=(/ 1, 2/)  
   B(1,:)=(/ 1, 2/)   
   C(1,:)=(/ 1,  1 /)   
   D(1,:)=(/ 1,  1 /)   
   D(2,:)=(/ 1,  3 /)  

   !E=(/A, B
   !    C, D)
   ! This shape of array
   !E=[A B
   !   C D]
   !Result should be as under
   !E=[1 1 1 2
   !   1 2 0 0
   !   1 1 1 1
   !   0 0 1 3]
  print *,E
  End program array1

如何在Fortran中获取此数组(E)?我正在研究f90和f95。我创建了一个新数组,它是array(E)。重要的是获得E,我可以在数组后改进,因为我不知道在数组中使用哪种情况或函数。如果是matlab,这很容易,但是对于fotran我不知道

我编写了一个函数,
catmat
,它获取两个二维数组,并将它们沿公共维度连接起来。请参见
E
F
,了解其工作原理。您需要的数组是
G

请注意,分配是在catmat内完成的

program main
  implicit none
  real, dimension(2,2) :: A
  real, dimension(1,2) :: B
  real, dimension(1,2) :: C
  real, dimension(2,2) :: D
  real, dimension(:,:), allocatable :: E
  real, dimension(:,:), allocatable :: F
  real, dimension(:,:), allocatable :: G
  integer :: i

  A = reshape( [1, 2, 3, 4], [2,2] )
  B(1,:) = [ -1, -2 ]
  C(1,:) = [ -3, -4 ]
  D = reshape( [5, 6, 7, 8], [2,2] )


  write(*,*) ( A(i,:), NEW_LINE('a'), i = 1, size(A,dim=1) )

  write(*,*) ( D(i,:), NEW_LINE('a'), i = 1, size(D,dim=1) )


  E = catmat( A, D, 1)

  write(*,*) "size of E", size(E, dim=1), size(E, dim=2)
  write(*,*) ( E(i,:), NEW_LINE('a'), i = 1, size(E,dim=1) )

  F = catmat( A, D, 2)

  write(*,*) "size of F", size(F, dim=1), size(F, dim=2)
  write(*,*) ( F(i,:), NEW_LINE('a'), i = 1, size(F,dim=1) )

  G = catmat( catmat( A, B, 1), catmat( C, D, 1), 2)

  write(*,*) "size of G", size(G, dim=1), size(G, dim=2)
  write(*,*) ( G(i,:), NEW_LINE('a'), i = 1, size(G,dim=1) )



contains
  function catmat(matl, matr, cdim) result(res)
    real, dimension(:,:), intent(in)  :: matl
    real, dimension(:,:), intent(in)  :: matr
    integer, intent(in)               :: cdim
    real, dimension(:,:), allocatable :: res
    integer                           :: max_dim

    ! Assuming 2d arrays
    if( cdim .ne. 1 .and. cdim .ne. 2 ) then
      write(*,*) "ERROR"
      stop
    end if

    max_dim =  size(matl,dim=cdim)
    if ( size(matr,dim=cdim) .gt. size(matl,dim=cdim) ) max_dim = size(matr,dim=cdim)


    if( cdim .eq. 1 ) then
      allocate( res( max_dim, size(matl,dim=2) + size(matr,dim=2) ) )
    else
      allocate( res( size(matl,dim=1) + size(matr,dim=1), max_dim ) )
    end if

    res = 0

    if(cdim .eq.1 ) then
      res(:,1:size(matl,dim=2)) = matl
      res(:,size(matl,dim=2)+1:size(matl,dim=2)+size(matr,dim=2)) = matr
    else
      res(1:size(matl,dim=1),:) = matl
      res(size(matl,dim=1)+1:size(matl,dim=1)+size(matr,dim=1),:) = matr
    end if

  end function catmat

end program main

我编写了一个函数,
catmat
,它获取两个二维数组,并将它们沿公共维度连接起来。请参见
E
F
,了解其工作原理。您需要的数组是
G

请注意,分配是在catmat内完成的

program main
  implicit none
  real, dimension(2,2) :: A
  real, dimension(1,2) :: B
  real, dimension(1,2) :: C
  real, dimension(2,2) :: D
  real, dimension(:,:), allocatable :: E
  real, dimension(:,:), allocatable :: F
  real, dimension(:,:), allocatable :: G
  integer :: i

  A = reshape( [1, 2, 3, 4], [2,2] )
  B(1,:) = [ -1, -2 ]
  C(1,:) = [ -3, -4 ]
  D = reshape( [5, 6, 7, 8], [2,2] )


  write(*,*) ( A(i,:), NEW_LINE('a'), i = 1, size(A,dim=1) )

  write(*,*) ( D(i,:), NEW_LINE('a'), i = 1, size(D,dim=1) )


  E = catmat( A, D, 1)

  write(*,*) "size of E", size(E, dim=1), size(E, dim=2)
  write(*,*) ( E(i,:), NEW_LINE('a'), i = 1, size(E,dim=1) )

  F = catmat( A, D, 2)

  write(*,*) "size of F", size(F, dim=1), size(F, dim=2)
  write(*,*) ( F(i,:), NEW_LINE('a'), i = 1, size(F,dim=1) )

  G = catmat( catmat( A, B, 1), catmat( C, D, 1), 2)

  write(*,*) "size of G", size(G, dim=1), size(G, dim=2)
  write(*,*) ( G(i,:), NEW_LINE('a'), i = 1, size(G,dim=1) )



contains
  function catmat(matl, matr, cdim) result(res)
    real, dimension(:,:), intent(in)  :: matl
    real, dimension(:,:), intent(in)  :: matr
    integer, intent(in)               :: cdim
    real, dimension(:,:), allocatable :: res
    integer                           :: max_dim

    ! Assuming 2d arrays
    if( cdim .ne. 1 .and. cdim .ne. 2 ) then
      write(*,*) "ERROR"
      stop
    end if

    max_dim =  size(matl,dim=cdim)
    if ( size(matr,dim=cdim) .gt. size(matl,dim=cdim) ) max_dim = size(matr,dim=cdim)


    if( cdim .eq. 1 ) then
      allocate( res( max_dim, size(matl,dim=2) + size(matr,dim=2) ) )
    else
      allocate( res( size(matl,dim=1) + size(matr,dim=1), max_dim ) )
    end if

    res = 0

    if(cdim .eq.1 ) then
      res(:,1:size(matl,dim=2)) = matl
      res(:,size(matl,dim=2)+1:size(matl,dim=2)+size(matr,dim=2)) = matr
    else
      res(1:size(matl,dim=1),:) = matl
      res(size(matl,dim=1)+1:size(matl,dim=1)+size(matr,dim=1),:) = matr
    end if

  end function catmat

end program main

尝试使用数组串联操作逐行分配数组
[a,b]

Program array1
!*************************************************! 
implicit none

INTEGER, PARAMETER :: m=2 !rows
INTEGER, PARAMETER :: n=2 !cols
Real, DIMENSION(m,n) :: A,D
Real, DIMENSION(m,n) :: B,C              ! made B,C conforming

REAL, allocatable,DIMENSION(:,:) :: E

    allocate(E(2*m,2*n))
    ! Assign values to the matrix
    A(1,:)=[ 1, 1 ]   
    A(2,:)=[ 1, 2 ]  
    B(1,:)=[ 1, 2 ]   
    C(1,:)=[ 1, 1 ]   
    D(1,:)=[ 1, 1 ]   
    D(2,:)=[ 1, 3 ]

    ! This shape of array
    !E=[A B
    !   C D]

    ! assign row-by-row, using array concat
    E(1,:) = [A(1,:),B(1,:)]
    E(2,:) = [A(2,:),B(2,:)]
    E(3,:) = [C(1,:),D(1,:)]
    E(4,:) = [C(2,:),D(2,:)]

   ! print results row-by-row
    write (*,*) E(1,:)
    write (*,*) E(2,:)
    write (*,*) E(3,:)
    write (*,*) E(4,:)

End program array1
或者,也可以使用数组部分

E(1:2, 1:2) = A
E(1:1, 3:4) = B
E(3:3, 1:2) = C
E(3:4, 3:4) = D

尝试使用数组串联操作逐行分配数组
[a,b]

Program array1
!*************************************************! 
implicit none

INTEGER, PARAMETER :: m=2 !rows
INTEGER, PARAMETER :: n=2 !cols
Real, DIMENSION(m,n) :: A,D
Real, DIMENSION(m,n) :: B,C              ! made B,C conforming

REAL, allocatable,DIMENSION(:,:) :: E

    allocate(E(2*m,2*n))
    ! Assign values to the matrix
    A(1,:)=[ 1, 1 ]   
    A(2,:)=[ 1, 2 ]  
    B(1,:)=[ 1, 2 ]   
    C(1,:)=[ 1, 1 ]   
    D(1,:)=[ 1, 1 ]   
    D(2,:)=[ 1, 3 ]

    ! This shape of array
    !E=[A B
    !   C D]

    ! assign row-by-row, using array concat
    E(1,:) = [A(1,:),B(1,:)]
    E(2,:) = [A(2,:),B(2,:)]
    E(3,:) = [C(1,:),D(1,:)]
    E(4,:) = [C(2,:),D(2,:)]

   ! print results row-by-row
    write (*,*) E(1,:)
    write (*,*) E(2,:)
    write (*,*) E(3,:)
    write (*,*) E(4,:)

End program array1
或者,也可以使用数组部分

E(1:2, 1:2) = A
E(1:1, 3:4) = B
E(3:3, 1:2) = C
E(3:4, 3:4) = D


您是想通过复制数字从数组
a、B、C、D
创建一个新数组
E
,还是希望它们以某种方式成为
E
的一部分?你真的需要旧的Fortran 90吗?你有什么代码可以分享吗?
A、B、C、D如何声明?应该如何声明
E
?可以使用f90和f95。我创建了一个新数组,并想放入该数组中。您是想通过复制数字从数组
a、B、C、D
创建一个新数组
E
,还是希望它们成为
E
的一部分?你真的需要旧的Fortran 90吗?你有什么代码可以分享吗?
A、B、C、D如何声明?应该如何声明
E
?可以使用f90和f95。我创建了一个新数组,并希望将其放入该数组中。
(//)
[]
之间没有区别。后者是Fortran 2003语法,用于相同的东西,数组构造函数。它不是一个“数组连接运算符”。@VladimirF-它是两者
c=[a,b]
a
b
连接成
c
。它将a和b组成一个数组,不管它们是什么。但是,代码的前半部分是
(//)
,然后突然在代码的另一半是
[]
,再加上不准确的名称(或标准中未找到的名称)以及OP要求F95的事实,在我看来,有必要作出澄清评论。@VladimirF-我编辑了这篇文章,删除了“旧的”
(\X\)
用“new”
[X]
表示法。
(//)
[]
之间没有区别。后者是Fortran 2003语法,用于相同的东西,数组构造函数。它不是一个“数组连接运算符”。@VladimirF-它是两者
c=[a,b]
a
b
连接成
c
。它将a和b组成一个数组,不管它们是什么。但是,代码的前半部分是
(//)
,然后突然在代码的另一半是
[]
,再加上不准确的名称(或标准中未找到的名称)以及OP要求F95的事实,在我看来,有必要作出澄清评论。@VladimirF-我编辑了这篇文章,删除了“旧的”
(\X\)
用“new”
[X]
表示法。我尝试用fortran f90执行,但我认为这是用fortran 2003语法编写的。因为我正在处理f90/f95,并且给出了错误。我不知道我哪里做错了。感谢您的努力:)@Nobody该
新行
固有语法和
[]
语法来自F2003。而且该函数的
allocatable
结果是F2003或F95+a技术规范。我仍然尝试在f90中转换为代码。因为
函数catmat(matl,matr,cdim)result(res)
是2003年的语法。有人能帮我了解f90/f95格式吗?我认为这种
(result(res))
格式对于f90@Eliad和@Vladimir@nobody在Fortran 90中,
结果
子句非常好。结果变量的可分配属性是F2003,但
result
关键字本身是Fortran 90。无论如何,Fortran 90已经过时了,它太旧了,不适合现代程序。非常感谢所有的评论和对程序的帮助:)我尝试用Fortran f90执行,但我认为这是用Fortran 2003语法编写的。因为我正在处理f90/f95,并且给出了错误。我不知道我哪里做错了。感谢您的努力:)@Nobody该
新行
固有语法和
[]
语法来自F2003。而且该函数的
allocatable
结果是F2003或F95+a技术规范。我仍然尝试在f90中转换为代码。因为
函数catmat(matl,matr,cdim)result(res)
是2003年的语法。有人能帮我了解f90/f95格式吗?我认为这种
(result(res))
格式对于f90@Eliad和@Vladimir@nobody在Fortran 90中,
结果
子句非常好。结果变量的可分配属性是F2003,但
result
关键字本身是Fortran 90。Fortran 90已经过时了,它太旧了,不适合现代程序。非常感谢您对程序的所有评论和帮助:)