例如我有数组(/ 1,3,4,5,7,9,11 /),如何删除它的第3个元素?我无法找到一个能够做到这一点的数组函数,也没有找到一个优雅的解决方案,因为我不知道如何追加到一个数组(这意味着,在前面定义的元素旁边添加一个元素。)
我想从数组中删除所有偶数元素......我知道只有一个元素。
我可以使用MINLOC找到它的索引,但我不知道如何从数组中删除元素。
答案 0 :(得分:6)
让
a = (/1,3,4,5,7,9,11/)
然后
pack(a,mod(a,2)/=0)
将返回a
的奇数元素。这与删除第3个元素并不完全相同,但您的问题表明删除偶数元素确实是您想要做的。
如果您声明
integer, dimension(:), allocatable :: oddones
然后
oddones = pack(a,mod(a,2)/=0)
将oddones
包含a
的奇数元素。您需要一个最新的编译器才能使用此自动分配。
请注意,在Fortran中,与任何理智的语言一样,数组的大小固定,因此不支持删除元素。但是,如果a
本身为allocatable
,那么您可以在表达式的 lhs 上使用a
。让我们留给哲学家,无论a
在此操作下是否保持不变。
答案 1 :(得分:1)
我有一段时间没有使用过FORTRAN,但看看CSHIFT和EOSHIFT的功能。我想你无法改变数组的大小。
答案 2 :(得分:1)
一个工作示例,感谢this discussion。谢谢,Dick Hendrickson和Dave Frank。
引用:
joel GUERRERO 写道 (2004年9月2日星期四下午6:29)
我有这个问题,如何添加记录或删除 记录从列表或数组n fortran 90 ??
也就是说,假设我有以下数组:
(1 4 3 9 10 2 15 8)
我想在第4位添加值13以获得:
(1 4 3 13 9 10 2 15 8)
几个星期前你问过,这导致我向新闻组询问F2003添加了什么语法来促进此操作。
Dick Hendrickson的回复表明以下将使用F2003 语法。
integer,allocatable :: v(:) v = [1, 4, 3, 9, 10, 2, 15, 8] v = [v(:3), 13, v(4:)] ! insert 13 into expanded size v at v(4)
dave_frank 9/3/2004 8:07:59 AM
工作回答:根据要求,仅删除1个匹配的项目:
program hello
integer a(8)
integer b(7)
a=[1, 3, 4, 5, 7, 9, 11, 13]
index = minloc(a, dim=1, mask=(mod(a, 2) .eq. 0))
b=[a(1:index-1), a(index+1:size(a))]
print *, b
end program Hello
你可以循环," while(index)"如果您愿意,可以根据需要进行其他编辑,以删除所有匹配项。
答案 3 :(得分:1)
你可以做一些切片。
integer, parameter:: max = 10
integer used ! number of elements used
integer, dimension(1:max):: store
...
used = max
...
! Remove element n
if (n > 0 .and. n < used) then
store(n:(used - 1)) = store((n+1):used)
end if
if (n > 0) used = used - 1
答案 4 :(得分:0)
如果你使用固定的最大尺寸,但想要在其中进行动态行为,你可以只移动元素:
integer, parameter :: max=10
integer :: a(max)
integer :: length_a, index, i
length_a = 8
a(1:length_a)=[1, 3, 4, 5, 7, 9, 11, 13]
!remove (third) element
index = 3
do i=index,length_a-1
a(i)=a(i+1)
end do
length_a=length_a-1
优点是这不会使用临时数组。