2

我有两个 p*n 数组,y 和 ymiss。y 包含实数和 NA。ymiss 包含 1 和 0,因此如果 y(i,j)==NA,则 ymiss(i,j)==0,否则为 1。我还有 1*n 数组 ydim,它告诉 y(1:p,n) 处有多少实数,所以 ydim 的值是 0 到 p

在 R 编程语言中,我可以执行以下操作:

if(ydim!=p && ydim!=0)  
  y(1:ydim(t), t) = y(ymiss(,t), t)

该代码将 y(,t) 的所有实数排列成这样

首先有例如 y(,t) = (3,1,NA,6,2,NA) 在代码之后是 y(,t) = (3,1,6,2,2,NA)

现在我只需要那些第一个 1:ydim(t),所以其余的无关紧要。

问题是,我怎样才能在 Fortran 中做类似的事情?

谢谢,

朱尼

4

2 回答 2

2

“where 语句”和“merge”内在函数功能强大,可以对数组中的选定位置进行操作,但它们不会将项目移动到数组的前面。使用带有显式索引的老式代码(可以打包成一个函数),例如:

k=1
do i=1, n
   if (ymiss (i) == 1) then
      y(k) = y(i)
      k = k + 1
   end if
end do

您可以使用“pack”内在函数通过数组内在函数来完成您想要的事情。将 ymiss 转换为逻辑数组: 0 --> .false., 1 --> .true.. 然后使用类似代码(在没有第二个索引的情况下测试):

y(1:ydim(t), t) = pack (y (:,t), ymiss (:,t))


编辑以添加示例代码,显示 Fortran 内在函数“where”、“count”和“pack”的使用。单独的“where”不能解决问题,但是“pack”可以。在此示例中,我使用“< -90”作为 NaN。OP 不需要步骤“y (ydim+1:LEN) = -99.0”,不需要使用这些元素。

program test1

integer, parameter :: LEN = 6
real, dimension (1:LEN) :: y = [3.0, 1.0, -99.0, 6.0, 2.0, -99.0 ]
real, dimension (1:LEN) :: y2
logical, dimension (1:LEN) :: ymiss
integer :: ydim

y2 = y
write (*, '(/ "The input array:" / 6(F6.1) )' )  y

where (y < -90.0)
   ymiss = .false.
elsewhere
   ymiss = .true.
end where

ydim = count (ymiss)

where (ymiss) y2 = y
write (*, '(/ "Masking with where does not rearrange:" / 6(F6.1) )' )  y2

y (1:ydim) = pack (y, ymiss)
y (ydim+1:LEN) = -99.0
write (*, '(/ "After using pack, and ""erasing"" the end:" / 6(F6.1) )' )  y


stop

end program test1

输出是:

输入数组:3.0 1.0 -99.0 6.0 2.0 -99.0

掩蔽 where 不重新排列:3.0 1.0 -99.0 6.0 2.0 -99.0

使用包后,“擦除”结束:3.0 1.0 6.0 2.0 -99.0 -99.0

于 2010-01-05T15:57:06.600 回答
1

在 Fortran 中,您不能将 na 存储在实数数组中,您只能存储实数。因此,您可能希望将 na 替换为您的数据中不太可能出现的一些值:huge() 可能是合适的。二维数组对于 Fortan 来说完全没有问题。您可能希望使用 2D 逻辑数组来替换 ymiss,而不是 1 和 0 的 2D 数组。

没有简单的内在实现你想要的,你需要编写一个函数。但是,一种更 Fortran 的做事方式是使用逻辑数组作为您要执行的操作的掩码。

所以,这里有一些零碎的 Fortran 代码,未经测试:

! Declarations
real(8), dimension(m,n) :: y, ynew
logical, dimension(m,n) :: ymiss

! Executable
where (ymiss) ynew = func(y)  ! here func() is whatever your function is
于 2010-01-05T10:45:13.977 回答