2011-12-02 104 views
0

我想通过访问fortran中的边界元素来检查我的数组是否返回废话。我想检查这些值是否小于1,如果是,请将它们更改为1。在阵列上操作元素

这是一张我的代码引起的问题:

lastNeighLabel=(/clusterLabel(jj-1,kk,ll), clusterLabel(jj,kk-1,ll), clusterLabel(jj,kk,ll-1)/) LastNeighLabel包含集群标签(介于1到n,其中n isthe发现独特的独立簇的总数)在x的最后一个邻居, y,z方向。

jjkkll是1,他们尝试和在阵列中访问第0个元素,并且如在阵列1 FORTRAN计数,它试图破坏宇宙。我目前纠结在大约8个if/elseif语句试图为每个可能性编码。但我希望在每个元素上都有一种操作方式。所以基本上我想说where((/jj-1,kk-1,ll-1/).lt.1) do clusterLabel(jj-1,kk,ll)=0 etc取决于哪个元素导致问题。

但我不能想办法做到这一点,因为哪里只会操纵传递给它的变量,而不是在同一个索引处的不同数组。或者我错了?

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

+0

你想有例如lastNeighLabel =(/ 0,clusterLabel(JJ,KK-1,LL),clusterLabel(JJ,KK,LL-1)/)如果JJ == 0? –

+0

是的,这就是我所追求的。 – Pureferret

回答

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)等

+0

啊我想我跟着。 因此,如果clusterLabel的任何元素为0,则返回0? 如何将该功能放入程序中?它会返回数组吗? – Pureferret

+0

是的,我的意思是。当然,类似的上限,你可以传递上限到函数或使用UBOUND内在。 –

+0

我设计代码的方式只能看到之前的邻居(因此-1),它不应该看上边界。如果是这样,我会遵照你的建议。否则,谢谢。现在去试试。 – Pureferret

4

这不是强制性的是Fortran的访问从1开始阵列。任何初始值都是允许的。如果更方便,你有一个零索引的数组,声明数组为:

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

或者

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

,并有0指数要格外赶上特殊情况。

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

+0

当然是对的。在许多情况下这将是更好的选择。 –

3

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

 
integer :: extended_cluster_label(0:size(cluster_label,1), & 
            0:size(cluster_label,2), & 
            0:size(cluster_label,3) & 
           ) 

extended_cluster_label(0,:,:) = 0 
extended_cluster_label(:,0,:) = 0 
extended_cluster_label(:,:,0) = 0 

extended_cluster_label(1:, 1:, 1:) = cluster_label