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

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

当您想初始化具有特定测试值以用于数学目的的矩阵时,如何在fortran中进行相同的操作? (无需双向索引单独的语句上的每个元素)

阵列要么定义

real, dimension(3, 3) :: a

或者

real, dimension(:), allocatable :: a
有帮助吗?

解决方案

你可以使用 重塑形状 内在。就像是:

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

您也需要 转置 固有的:

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

有关更一般的示例(可分配的2D数组具有不同的维度),一个需要 尺寸 固有的:

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)阵列,初始化的Fortran方式与C解决方案有所不同,因为在C多维数组中只是等等的数组。

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

除了已经回答的内容外,还有一种更直接的方法可以按行输入矩阵的值,如列:reshape具有可选的参数 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

令我惊讶的是

 real:: y(3,3) = (/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)

不是 被编译器(尝试的G95,Gfortran)接受。事实证明 shape(/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)9 并不是 3 3!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top