2D array concatenation in fortran

后端 未结 3 1777
误落风尘
误落风尘 2021-01-22 04:16

Fortran 2003 has square bracket syntax for array concatenation, Intel fortran compiler supports it too. I wrote a simple code here for matrix concatenation:

prog         


        
相关标签:
3条回答
  • 2021-01-22 04:38

    Fill it using 1-D arrays then reshape your mat3.

    0 讨论(0)
  • 2021-01-22 04:49

    Another way could simply be to

    mat3(:,1:3) = mat1
    mat3(:,4:6) = mat2
    

    I dont know which is faster, this or the do loop above...

    0 讨论(0)
  • 2021-01-22 04:51

    The array concatenation in fortran 2003 doesn't work as you think. When you concatenate, it's not going to stack the two arrays side by side. It will pick elements from the first array one by one and put into a one-dimensional array. Then it will do the same thing with the second array but it will append this to the 1-D form of first array.

    The following code works.

    program matrix
    implicit none
    real,dimension (3,3) :: mat1,mat2
    real,dimension(18) :: mat3
    integer i
    
    mat1=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/))
    mat2=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/))
    mat3=[mat1,mat2]
    
    print*, shape([mat1,mat2])  !check shape of concatenated array
    !display
    do i=1,18,1
    write(*,10) mat3(i)
    10 format(F10.4)
    end do
    
    end program
    

    However, the result you wanted can be achieved using following code

    program matrix
    implicit none
    real,dimension (3,3) :: mat1,mat2
    real,dimension(3,6) :: mat3
    integer i
    
    mat1=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/))
    mat2=reshape( (/1,2,3,4,5,6,7,8,9/),(/3,3/))
    
    do i=1,3
    mat3(i,:)=[mat1(:,i),mat2(:,i)]
    enddo
    
    !display
    do i=1,3,1
    write(*,*) mat3(i,:)
    end do
    
    end program
    
    0 讨论(0)
提交回复
热议问题