我想要一个数组从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
Run Code Online (Sandbox Code Playgroud)
该标志基本上检查两个圆是否相交.因此,如果没有交集,没有值被分配给阵列circlesx
和circlesy
.我首先分配的数组的大小是n个圆=的最大交点数n^2-n
.如果我不分配它,我会遇到分段错误.
重塑也没有用,虽然我可能在那里做错了.这给出了一个无法分类的陈述错误: -
reshape(circlesx,[ n**2-n-1 ])
Run Code Online (Sandbox Code Playgroud)
我希望圆圈数组的大小k-2
在循环完成后更改为
所以我需要的是,如果n = 2,那么circlex和circley的大小为2,那么,
circlesx=[0,0]
.
.
some calculations
.
.
circlesx=[1.2,0] ! only one value has been allocated
.
.
reshape the array accordingly
.
.
circlesx=[1.2]
Run Code Online (Sandbox Code Playgroud)
在Fortran有什么办法吗?我正在使用f90文件扩展名并使用gfortran v7.3.0
这里关于动态调整数组大小的问题通常关心放大数组.这是一个更难的问题.1
但是,基本考虑因素大致相同.考虑
integer, allocatable :: arr(:)
allocate(arr(3))
arr = [1, 2, 3]
end
Run Code Online (Sandbox Code Playgroud)
通过内在的任务,我们可以从其他地方看到我们可以写作
integer, allocatable :: arr(:)
arr = [1, 2, 3]
end
Run Code Online (Sandbox Code Playgroud)
并已arr
分配到正确的形状作为任务的一部分.
我们已经看到这样:放大阵列
arr = [arr, 4]
Run Code Online (Sandbox Code Playgroud)
删除"坏值":
arr = PACK(arr, arr>1.and.arr<4)
Run Code Online (Sandbox Code Playgroud)
只选择前几个元素非常简单
arr = arr(:q)
Run Code Online (Sandbox Code Playgroud)
编译器需要特殊标志来编译这样的代码正确的日子正在慢慢传递,但是(特别是如果使用旧版本)检查编译器文档以确保如何确保在内部赋值上进行自动分配.
1即使在没有动态内存分配的日子里,也只是处理"较短"的数组.获取您需要的大型静态数组,并对使用的元素进行一些记录.在现代代码中,您可能会在使用旧库时看到这些人工制品.