0

我试图通过在fortran中访问越界元素来检查我的数组是否返回废话。我想检查这些值是否小于一,如果是,请将它们更改为一。

这是我的一段导致问题的代码:

lastNeighLabel=(/clusterLabel(jj-1,kk,ll), clusterLabel(jj,kk-1,ll), clusterLabel(jj,kk,ll-1)/) LastNeighLabel 分别包含 x、y、z 方向上最后一个邻居的集群标签(介于 1 和 n 之间,其中 n 是找到的唯一单独集群的总数)。

jjorkkll为 1 时,它们会尝试访问数组中的第 0 个元素,并且FORTRAN从数组中的 1 开始计数,它会尝试破坏宇宙。我目前正处于大约 8 个 if/elseif 语句的混乱中,试图为每一种可能性编码。但我希望有一种方法可以对每个元素进行操作。所以基本上我想说where((/jj-1,kk-1,ll-1/).lt.1) do clusterLabel(jj-1,kk,ll)=0 etc这取决于哪个元素导致了问题。

但是我想不出一种方法来做到这一点,因为 where 只会操纵传递给它的变量,而不是同一索引处的不同数组。还是我错了?

如果这没有意义,我很乐意编辑。

4

3 回答 3

4

Fortran 从一个开始访问数组不是强制性的。允许任何起始值。如果使用零索引数组更方便,请将数组声明为:

real, dimension (0:N-1, 0:M-1) :: array

或者

real, dimension (0:N, 0:M) :: array

并让 0 索引额外捕获特殊情况。

这可能是您问题的另一种解决方案,因为零索引值是合法的。

于 2011-12-02T14:53:14.410 回答
3

解决此问题的另一种可能方法是创建一个扩展的簇标签数组(索引边界从 0 开始),它等于簇标签数组,其外部附加了一层零。然后,您可以让您的循环在 jj、kk 和 ll 的所有值上安全运行。如果这是一个可行的解决方案,这取决于数组的大小。

整数 :: extended_cluster_label(0:size(cluster_label,1), &
                                  0:大小(cluster_label,2),&
                                  0:大小(cluster_label,3)&
                                 )

扩展集群标签(0,:,:) = 0
扩展集群标签(:,0,:) = 0
扩展集群标签(:,:,0) = 0

扩展集群标签(1:,1:,1:)=集群标签
于 2011-12-02T14:54:42.040 回答
2

也许你可以使用一个函数?

  real function f(A,i,j,k)  
   real :: A(:,:,:)
   integer :: i,j,k

   if (i==0.or.j==0.or.k==0) then
    f=0
   else
    f=A(i,j,k)
   endif

  end function f

然后使用 f(clusterLabel,jj-1,kk,ll) 等。

于 2011-12-02T11:41:11.297 回答