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