如何初始化fortran

问题描述 投票:0回答:4

在C中,您可以使用卷曲括号语法轻松初始化数组,如果我没记错的话:

int* a = new int[] { 1, 2, 3, 4 };

当您想初始化具有特定的测试值以用于数学目的的矩阵时,如何在fortran中进行二维数组? (不必双重地将每个元素索引在单独的语句上)

数组是由

定义的
real, dimension(3, 3) :: a

or

real, dimension(:), allocatable :: a
arrays fortran fortran90 array-initialize
4个回答
67
投票
您可以使用

reshape形式来做到这一点。类似: INTEGER, DIMENSION(3, 3) :: array array = reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array))

但请记住列订单。阵列将是

1 4 7 2 5 8 3 6 9

重塑后
要获得:

1 2 3 4 5 6 7 8 9

您还需要

transpose

固有的:
array = transpose(reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array)))

对于更一般的示例(可分配的2D阵列具有不同的维度),需要size in instim:

PROGRAM main

  IMPLICIT NONE

  INTEGER, DIMENSION(:, :), ALLOCATABLE :: array

  ALLOCATE (array(2, 3))

  array = transpose(reshape((/ 1, 2, 3, 4, 5, 6 /),                            &
    (/ size(array, 2), size(array, 1) /)))

  DEALLOCATE (array)

END PROGRAM main

对于多维(等级> 1)阵列,初始化的福特方式与C解决方案有所不同,因为在C多维阵列中只是等等的数组。

在fortran,每个等级对应于修改后的数据类型的不同属性。但是,对于等级1数组,只有一个数组构造函数。从这两个原因中,通过数组构造函数进行初始化需要
RESHAPE
杂文函数。

25
投票
ORDER

,可用于修改填充元素的顺序带有数组构造函数的多维数组。

例如,在第一个答案中的示例中,可以写下:

INTEGER, DIMENSION(3, 3) :: array=reshape( (/ 1, 2, 3, &
                                              4, 5, 6, &
                                              7, 8, 9 /), &
                                           shape(array), order=(/2,1/) )

以代码行所示的顺序,将矩阵数组的填充填充。

阵列

(/2, 1/)
迫使列索引

(2)

在行索引上具有优先级,给出了所需的效果。

阵列初始化可以在数组声明语句本身中完成,如下所示:

(1)

这让我感到惊讶

program test real:: x(3) = (/1,2,3/) real:: y(3,3) = reshape((/1,2,3,4,5,6,7,8,9/), (/3,3/)) integer:: i(3,2,2) = reshape((/1,2,3,4,5,6,7,8,9,10,11,12/), (/3,2,2/)) end program test
编译器接受(g95,gfortran)。事实证明
real:: y(3,3) = (/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)
shape

,而不是

10
投票

在这里,一个程序初始化了代表本周的二维数组,用于

9

-显示了如何保持此
shape

reshape逻辑上的内容。 3 3

在这里是程序
的输出
7 days
表明克里斯特的
2 weeks

PROGRAM INIT2WEEKS CHARACTER, PARAMETER :: CLIST(7,2) = & RESHAPE([ ['S','M','T','W','t','F','s'], & ['S','M','T','W','t','F','s'] ], & SHAPE(CLIST)) INTEGER IDAY,IWEEK DO IWEEK=1,2 DO IDAY=1,7 WRITE(*,'(A,X,I1,X,A)') 'WEEK',IWEEK,CLIST(IDAY,IWEEK) ENDDO ENDDO WRITE(*,*) 'SHAPE:',SHAPE(CLIST) STOP ENDPROGRAM

0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.