代码之家  ›  专栏  ›  技术社区  ›  Yuki.kuroshita

从Fortran中的数组中删除索引值后的所有行

  •  2
  • Yuki.kuroshita  · 技术社区  · 6 年前

    我希望一个数组从Fortran中的数组中删除某个索引值之后的所有行。这意味着,如果数组的大小最初是p,那么它应该变成q,其中q是要删除所有内容的索引。

    下面是相关的代码位:

    real(8), allocatable :: circlesx(:),circlesy(:)
    allocate(circlesx(n**2-n))
    allocate(circlesy(n**2-n))
    
    do i=1,n-1
        do j=i+1,n
            call intersect2circles(stlo(i),stla(i),distance(i),stlo(j),stla(j),distance(j),ax,ay,bx,by,flag)
            if (flag==0) then
                circlesx(k)=ax
                circlesy(k)=ay
                circlesx(k+1)=bx
                circlesy(k+1)=by
                k=k+2
            endif
        enddo
    enddo
    

    旗子主要检查两个圆是否相交。因此,如果没有交集,就不会给数组赋值 circlesx circlesy .我首先分配的数组的大小是n个圆的最大交点数。= n^2-n . 如果我不分配,就会出现分割错误。

    整形也没用,虽然我可能做错了。这给出了一个不可分类的语句错误:

    reshape(circlesx,[ n**2-n-1 ])
    

    我想把圆形数组的大小改为 k-2 循环完成后

    所以我需要的是,如果n=2,那么Circlesx和Circlesy的大小是2,那么,

    circlesx=[0,0]
    .
    .
    some calculations
    .
    .
    circlesx=[1.2,0] ! only one value has been allocated
    .
    .
    reshape the array accordingly
    .
    .
    circlesx=[1.2]
    

    在Fortran中有什么方法可以做到这一点吗?我使用的是F90文件扩展名和gfortran v7.3.0

    1 回复  |  直到 6 年前
        1
  •  5
  •   francescalus    6 年前

    这里关于数组动态调整大小的问题通常关心的是扩大数组。这是更困难的问题。

    然而,基本的考虑因素是相同的。考虑

    integer, allocatable :: arr(:)
    allocate(arr(3))
    arr = [1, 2, 3]
    
    end
    

    我们从其他地方看到的内在分配,我们可以

    integer, allocatable :: arr(:)
    arr = [1, 2, 3]
    
    end
    

    并拥有 arr 作为分配的一部分分配给正确的形状。

    我们已经看到:放大一个阵列

    arr = [arr, 4]
    

    删除“坏值”:

    arr = PACK(arr, arr>1.and.arr<4)
    

    只选择前几个元素非常简单

    arr = arr(:q)
    

    编译器需要特殊标志来正确编译此类代码的日子正在慢慢过去,但一定要检查编译器文档,以了解如何确保在内部分配上自动分配。


    即使在没有动态内存分配的日子里,也有人简单地处理“较短”的数组。取一个静态大小的数组,尽可能大,并围绕使用的元素数量做一些簿记。在现代代码中,当使用旧库时,您可能会看到这样的人工制品。

    推荐文章