根据另一个数组中的元素分配数组元素

时间:2014-09-10 23:22:34

标签: arrays fortran fortran90 fortran77

第一次发布在这里,我有一个(可能非常简单)的问题。

我想根据另一个数组(B)中的相应值分配一个数组(A)中的元素值,例如,如果A(1)= 2则将4分配给B(1)。

我想象这将使用DO循环和一些if语句来实现。然而,我使用的If staments似乎在那时引用了循环索引而不是特定元素。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

您还可以尝试使用merge构建一个构造... merge使用掩码从两个现有数组构造一个新数组,以选择正确的值:

program test
  integer,parameter :: LENGTH=5
  integer :: A(LENGTH)
  integer :: B(LENGTH)
  real    :: R(LENGTH)
  integer :: i

  call random_number(R)
  A = int( R*3 )
  B = [ ( i,i=1,LENGTH) ]

  print *,'A:',A

  print *,'B:',B
  B = merge( 4, B, A == 2 )
  print *,'B:',B
end program

输出:

 A:           2           1           2           2           1
 B:           1           2           3           4           5
 B:           4           2           4           4           5

说明:

  B = merge( 4, B, A == 2 )
  • A == 2构建一个临时逻辑数组.true. i如果A(i) == 2
  • 在这种情况下,
  • 4是一个与B
  • 长度相同的临时数组
  • 因此,如果临时逻辑数组为merge,则4会从.true.中选择值,否则会从B中选择相应的值。
  • 结果向量将写回B=

答案 1 :(得分:1)

您可以使用屏蔽数组分配。给定两个数组AB,具有相同的形状(即相同数量的排名,每个维度中的大小相同),并且如果要将B的元素设置为4,其中A的相应元素等于2,您只需编写

即可
where(A==2) B = 4

whereelsewhere合作,而非ifelse if,并且还有end where。有关详细信息,请参阅您最喜欢的文档。

如果您无法用where表达您的操作,您可能(如果您有最新的编译器)对do concurrent构造感兴趣。并且,如果所有其他方法都失败了,那么有一些老式的doif可以依赖。