Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vector 如何在Fortran中排列向量元素?_Vector_Fortran_Elements - Fatal编程技术网

Vector 如何在Fortran中排列向量元素?

Vector 如何在Fortran中排列向量元素?,vector,fortran,elements,Vector,Fortran,Elements,我有两个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,

我有两个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中做这样的事情

谢谢


Jouni在Fortran中,不能将na存储在实数数组中,只能存储实数。因此,您可能希望用一些数据中不太可能存在的值来替换na:可能适合使用巨型()。二维数组对于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
“where语句”和“merge”内在函数功能强大,可以在数组中的选定位置上操作,但它们不会将项移动到数组的前面。使用带有显式索引的老式代码(可以打包到函数中),例如:

您可以使用“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”,OP不需要使用这些元素

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
程序测试1
整数,参数::LEN=6
实数,维(1:LEN)::y=[3.0,1.0,-99.0,6.0,2.0,-99.0]
实数,维数(1:LEN)::y2
逻辑维度(1:LEN)::ymiss
整数::ydim
y2=y
写入(*,“(/”输入数组:“/6(F6.1))”)y
式中(y<-90.0)
ymiss=.false。
在别处
ymiss=.true。
在哪里结束
ydim=计数(ymiss)
式中(ymiss)y2=y
写入(*,“(/”带where的掩码不重新排列:“/6(F6.1))”)y2
y(1:ydim)=组(y,ymiss)
y(ydim+1:LEN)=-99.0
在使用pack后写入(*、“(/”,并“擦除”结尾:“/6(F6.1))”)y
停止
结束程序测试1
输出为:

输入数组: 3.01.0-99.06.02.0-99.0

使用where进行掩蔽不会重新排列: 3.01.0-99.06.02.0-99.0

使用pack并“擦除”结束后: 3.01.06.02.0-99.0-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