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
Loops Fortran循环的输出不正确_Loops_Fortran - Fatal编程技术网

Loops Fortran循环的输出不正确

Loops Fortran循环的输出不正确,loops,fortran,Loops,Fortran,我已经编写了一个例程,为包含1的右下单元提供列索引位置,标记掩码数组中多边形的右边缘 但是当我打印索引数组时(我意识到行位置数组是冗余的),所有行都报告了一个位置(除了0),我知道不应该是这样。我似乎找不到以下哪一点是不正确的 示例掩码数组: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1

我已经编写了一个例程,为包含
1
的右下单元提供列索引位置,标记掩码数组中多边形的右边缘

但是当我打印索引数组时(我意识到行位置数组是冗余的),所有行都报告了一个位置(除了
0
),我知道不应该是这样。我似乎找不到以下哪一点是不正确的

示例掩码数组:

0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 1 1 0 0 0 0 0 
0 0 0 0 0 1 1 1 1 1 1 0 0 0 
0 0 0 1 1 1 1 1 1 1 1 0 0 0 
0 0 0 1 1 1 1 1 1 1 1 0 0 0
0 0 0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
[0,10,10,11,11,11,9,8,0]
  subroutine get_right_idx(mask_array, idx_x, idx_y)                        
  integer, parameter :: x = 169 ! num columns                               
  integer, parameter :: y = 124 ! num rows                                  
  integer i ! iterator for rows                                             
  integer j ! iterator for columns                                          
  integer row_x ! x position for furthest south cell in row                 
  integer row_y ! y position for furthest south cell in row                 
  integer :: idx_x(y) ! index positions for lowest lat in model grid - x    
  integer :: idx_y(y) ! index positions for lowest lat in model grid - y    
  real mask_array(y,x) ! mask array of zeros, containing polygon of ones    

  do j=1,y                                                                  
    row_x = 0                                                               
    row_y = 0                                                               
    do i=1,x                                                                
      if (mask_array(j,i).eq.1) then                                        
        row_x = i                                                           
        row_y = j                                                           
      endif                                                                 
    enddo                                                                   
    idx_x(j)=row_x                                                          
    idx_y(j)=row_y                                                          
  enddo                                                                     
  endsubroutine get_right_idx  
125         104         104         104         104         104         104         114         114         114         114         103         103         103         108         108         103         103         103         103          97          97          97         107         107         107         107         107         107         107         107         107          97         101         101         101         101         101         111         111         111         111         111         111         101         101         100         105         105         105         105         105         105         100         115         115         104         104         104         104         104         104         104         104         104         104          98          98          98          98         108         108         108         108         108         108         108         108          98         102         102         102         102         102         112         112         112         112         112         112         101         101         101         106         106         106         101         101         101          95          95         105         105         105         105         105         105         105         105         105         105          99          99          99          99          99         109         109         109         109         109         109         109          99          99
所需输出:

0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 1 1 0 0 0 0 0 
0 0 0 0 0 1 1 1 1 1 1 0 0 0 
0 0 0 1 1 1 1 1 1 1 1 0 0 0 
0 0 0 1 1 1 1 1 1 1 1 0 0 0
0 0 0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
[0,10,10,11,11,11,9,8,0]
  subroutine get_right_idx(mask_array, idx_x, idx_y)                        
  integer, parameter :: x = 169 ! num columns                               
  integer, parameter :: y = 124 ! num rows                                  
  integer i ! iterator for rows                                             
  integer j ! iterator for columns                                          
  integer row_x ! x position for furthest south cell in row                 
  integer row_y ! y position for furthest south cell in row                 
  integer :: idx_x(y) ! index positions for lowest lat in model grid - x    
  integer :: idx_y(y) ! index positions for lowest lat in model grid - y    
  real mask_array(y,x) ! mask array of zeros, containing polygon of ones    

  do j=1,y                                                                  
    row_x = 0                                                               
    row_y = 0                                                               
    do i=1,x                                                                
      if (mask_array(j,i).eq.1) then                                        
        row_x = i                                                           
        row_y = j                                                           
      endif                                                                 
    enddo                                                                   
    idx_x(j)=row_x                                                          
    idx_y(j)=row_y                                                          
  enddo                                                                     
  endsubroutine get_right_idx  
125         104         104         104         104         104         104         114         114         114         114         103         103         103         108         108         103         103         103         103          97          97          97         107         107         107         107         107         107         107         107         107          97         101         101         101         101         101         111         111         111         111         111         111         101         101         100         105         105         105         105         105         105         100         115         115         104         104         104         104         104         104         104         104         104         104          98          98          98          98         108         108         108         108         108         108         108         108          98         102         102         102         102         102         112         112         112         112         112         112         101         101         101         106         106         106         101         101         101          95          95         105         105         105         105         105         105         105         105         105         105          99          99          99          99          99         109         109         109         109         109         109         109          99          99
这是Fortran语言还是我的逻辑不正确( 例行程序:

0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 1 1 0 0 0 0 0 
0 0 0 0 0 1 1 1 1 1 1 0 0 0 
0 0 0 1 1 1 1 1 1 1 1 0 0 0 
0 0 0 1 1 1 1 1 1 1 1 0 0 0
0 0 0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
[0,10,10,11,11,11,9,8,0]
  subroutine get_right_idx(mask_array, idx_x, idx_y)                        
  integer, parameter :: x = 169 ! num columns                               
  integer, parameter :: y = 124 ! num rows                                  
  integer i ! iterator for rows                                             
  integer j ! iterator for columns                                          
  integer row_x ! x position for furthest south cell in row                 
  integer row_y ! y position for furthest south cell in row                 
  integer :: idx_x(y) ! index positions for lowest lat in model grid - x    
  integer :: idx_y(y) ! index positions for lowest lat in model grid - y    
  real mask_array(y,x) ! mask array of zeros, containing polygon of ones    

  do j=1,y                                                                  
    row_x = 0                                                               
    row_y = 0                                                               
    do i=1,x                                                                
      if (mask_array(j,i).eq.1) then                                        
        row_x = i                                                           
        row_y = j                                                           
      endif                                                                 
    enddo                                                                   
    idx_x(j)=row_x                                                          
    idx_y(j)=row_y                                                          
  enddo                                                                     
  endsubroutine get_right_idx  
125         104         104         104         104         104         104         114         114         114         114         103         103         103         108         108         103         103         103         103          97          97          97         107         107         107         107         107         107         107         107         107          97         101         101         101         101         101         111         111         111         111         111         111         101         101         100         105         105         105         105         105         105         100         115         115         104         104         104         104         104         104         104         104         104         104          98          98          98          98         108         108         108         108         108         108         108         108          98         102         102         102         102         102         112         112         112         112         112         112         101         101         101         106         106         106         101         101         101          95          95         105         105         105         105         105         105         105         105         105         105          99          99          99          99          99         109         109         109         109         109         109         109          99          99
实际遮罩(在开放办公室放大):

下面是我试图计算的掩码。我得到的数组中的所有元素都有一个非零值,无论从哪个方向计算,数组的开头和结尾都应该有零个元素

输出:

0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 1 1 0 0 0 0 0 
0 0 0 0 0 1 1 1 1 1 1 0 0 0 
0 0 0 1 1 1 1 1 1 1 1 0 0 0 
0 0 0 1 1 1 1 1 1 1 1 0 0 0
0 0 0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
[0,10,10,11,11,11,9,8,0]
  subroutine get_right_idx(mask_array, idx_x, idx_y)                        
  integer, parameter :: x = 169 ! num columns                               
  integer, parameter :: y = 124 ! num rows                                  
  integer i ! iterator for rows                                             
  integer j ! iterator for columns                                          
  integer row_x ! x position for furthest south cell in row                 
  integer row_y ! y position for furthest south cell in row                 
  integer :: idx_x(y) ! index positions for lowest lat in model grid - x    
  integer :: idx_y(y) ! index positions for lowest lat in model grid - y    
  real mask_array(y,x) ! mask array of zeros, containing polygon of ones    

  do j=1,y                                                                  
    row_x = 0                                                               
    row_y = 0                                                               
    do i=1,x                                                                
      if (mask_array(j,i).eq.1) then                                        
        row_x = i                                                           
        row_y = j                                                           
      endif                                                                 
    enddo                                                                   
    idx_x(j)=row_x                                                          
    idx_y(j)=row_y                                                          
  enddo                                                                     
  endsubroutine get_right_idx  
125         104         104         104         104         104         104         114         114         114         114         103         103         103         108         108         103         103         103         103          97          97          97         107         107         107         107         107         107         107         107         107          97         101         101         101         101         101         111         111         111         111         111         111         101         101         100         105         105         105         105         105         105         100         115         115         104         104         104         104         104         104         104         104         104         104          98          98          98          98         108         108         108         108         108         108         108         108          98         102         102         102         102         102         112         112         112         112         112         112         101         101         101         106         106         106         101         101         101          95          95         105         105         105         105         105         105         105         105         105         105          99          99          99          99          99         109         109         109         109         109         109         109          99          99

我为您的代码制作了一个快速的模板,但是根据我的建议。因为您想找到最大的索引j,其中有一个1,您可以通过以最大值启动您的j循环(在示例中为14)来简单地测试这一点如果
掩码数组==1,则向下工作,但退出内部do循环

您可以通过将
14
9
替换为这些维度的最大值来概括这一点

program get_right
   implicit none
   integer, dimension(9,14) :: mask_array
   integer :: i,j,mask_out(9),j_tmp
   mask_array(1,:)=[0,0,0,0,0,0,0,0,0,0,0,0,0,0]
   mask_array(2,:)=[0,0,0,0,0,0,0,1,0,0,0,0,0,0]
   mask_array(3,:)=[0,0,0,0,0,0,1,1,1,0,0,0,0,0]
   mask_array(4,:)=[0,0,0,0,0,1,1,1,1,1,1,0,0,0]
   mask_array(5,:)=[0,0,0,1,1,1,1,1,1,1,1,0,0,0]
   mask_array(6,:)=[0,0,0,1,1,1,1,1,1,1,1,0,0,0]
   mask_array(7,:)=[0,0,0,0,0,0,1,1,1,1,0,0,0,0]
   mask_array(8,:)=[0,0,0,0,0,0,0,0,0,1,0,0,0,0]
   mask_array(9,:)=[0,0,0,0,0,0,0,0,0,0,0,0,0,0]

   mask_out=0
   do i=1,9
      j_tmp=0
      print '(14(i0,2x))',mask_array(i,:)
      do j=14,1,-1
         if(mask_array(i,j)==1) then
            j_tmp=j
            exit
         endif
      enddo
      mask_out(i)=j
   enddo

   print *,""
   print '(9(i0,2x))',mask_out

end program get_right

我得到了
0,8,9,11,11,11,10,10,0
作为答案(这是您得到的,但是向后的)。

我为您的代码制作了一个快速模板,但根据我的建议。因为您想找到最大的索引j,其中有一个1,您可以通过以最大值启动您的j循环(在示例中,14)来测试这一点如果
掩码数组==1,则向下工作,但退出内部do循环

您可以通过将
14
9
替换为这些维度的最大值来概括这一点

program get_right
   implicit none
   integer, dimension(9,14) :: mask_array
   integer :: i,j,mask_out(9),j_tmp
   mask_array(1,:)=[0,0,0,0,0,0,0,0,0,0,0,0,0,0]
   mask_array(2,:)=[0,0,0,0,0,0,0,1,0,0,0,0,0,0]
   mask_array(3,:)=[0,0,0,0,0,0,1,1,1,0,0,0,0,0]
   mask_array(4,:)=[0,0,0,0,0,1,1,1,1,1,1,0,0,0]
   mask_array(5,:)=[0,0,0,1,1,1,1,1,1,1,1,0,0,0]
   mask_array(6,:)=[0,0,0,1,1,1,1,1,1,1,1,0,0,0]
   mask_array(7,:)=[0,0,0,0,0,0,1,1,1,1,0,0,0,0]
   mask_array(8,:)=[0,0,0,0,0,0,0,0,0,1,0,0,0,0]
   mask_array(9,:)=[0,0,0,0,0,0,0,0,0,0,0,0,0,0]

   mask_out=0
   do i=1,9
      j_tmp=0
      print '(14(i0,2x))',mask_array(i,:)
      do j=14,1,-1
         if(mask_array(i,j)==1) then
            j_tmp=j
            exit
         endif
      enddo
      mask_out(i)=j
   enddo

   print *,""
   print '(9(i0,2x))',mask_out

end program get_right

我得到了
0,8,9,11,11,11,10,10,0
作为答案(这是你得到的,但是向后的)。

或者,如果打字让你感到疲劳,你可以对此进行评估

maxval(mask_array*spread([(ix,ix=lbound(mask_array,dim=2),&
        ubound(mask_array,dim=2))],dim=1, ncopies=size(mask_array,dim=1)),dim=2)
如您所见,这会生成一个临时数组(如果遮罩很大,这可能是不需要的)使用
spread
和隐含do循环,此临时变量的每个元素都包含自己的列索引号。然后它将临时变量与
mask_数组相乘,执行元素相乘而不是矩阵相乘。最后获取结果每行的
maxval
。这将返回t中的向量他的命令和凯尔的密码一样

我已经编辑了代码以使用
lbound
ubound
而不是
1
size
,以防您希望在下界不是1的数组上使用代码

Bob的叔叔,但不要问这是否比Kyle的代码快。如果您对执行速度测试和度量感兴趣


顺便说一句,因为它只返回一个向量,并且不会修改它的参数或有任何其他副作用,所以我将它打包为一个函数,而不是一个子例程。

或者,如果键入使您感到疲劳,您可以对此进行评估

maxval(mask_array*spread([(ix,ix=lbound(mask_array,dim=2),&
        ubound(mask_array,dim=2))],dim=1, ncopies=size(mask_array,dim=1)),dim=2)
如您所见,这会生成一个临时数组(如果遮罩很大,这可能是不需要的)使用
spread
和隐含do循环,此临时变量的每个元素都包含自己的列索引号。然后它将临时变量与
mask_数组相乘,执行元素相乘而不是矩阵相乘。最后获取结果每行的
maxval
。这将返回t中的向量他的命令和凯尔的密码一样

我已经编辑了代码以使用
lbound
ubound
而不是
1
size
,以防您希望在下界不是1的数组上使用代码

Bob的叔叔,但不要问这是否比Kyle的代码快。如果您对执行速度测试和度量感兴趣


顺便说一句,因为它只返回一个向量,并且不会修改它的参数或有任何其他副作用,所以我将它打包为一个函数,而不是一个子程序。

如果你想要最高的索引为1,为什么不从顶部开始,然后使用
退出
命令向下工作呢?嗨,Kyle,谢谢,我不知道这是怎么回事。我想我在解释我试图做的那种奇怪的事情时做得很糟糕,但是我给出了一个数组和输出示例来帮助你。如果你想要最高的索引为1,为什么不从顶部开始,用
退出
命令向下工作呢?嗨,Kyle,谢谢,我不明白这是怎么回事。我想我在解释sor时做得很糟糕这不是我想做的奇怪的事情,但我给出了一个示例数组和输出来帮助。有趣的是,我实际上没有尝试运行我的示例数组,而是一直使用另一个更大的数组作为输入。明天我将再看一看。谢谢你Kyle。这看起来非常符合逻辑,与我的示例数组和输出差不多,但我继续得到值从我不正确的掩码数组中。对于我不知道掩码值(即
1
)存在的行,我得到了一些东西。Uff@shootingstars:可能您的2D数组在头部的映射与代码中的映射不同。Fortran是列主数组,您可能认为数组是行主数组(请参阅)。看起来不像,Kyle。不确定发生了什么。我更新了我的帖子,以显示我正在使用的掩码和生成的输出。很有趣。我实际上没有尝试运行我的示例数组,但一直使用另一个更大的数组作为输入。我明天再看一看。谢谢Kyle。这看起来非常符合逻辑,而且与我的大致相同,但我继续从掩码数组中获取不正确的值。对于我不知道掩码值(即
1
)存在的行,我将获取一些值。Uff。@shootin