在Fortran中,如何从数组中删除第N个元素?

时间:2014-01-28 05:00:11

标签: arrays matrix fortran intel-fortran

例如我有数组(/ 1,3,4,5,7,9,11 /),如何删除它的第3个元素?我无法找到一个能够做到这一点的数组函数,也没有找到一个优雅的解决方案,因为我不知道如何追加到一个数组(这意味着,在前面定义的元素旁边添加一个元素。)

我想从数组中删除所有偶数元素......我知道只有一个元素。

我可以使用MINLOC找到它的索引,但我不知道如何从数组中删除元素。

5 个答案:

答案 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

优点是这不会使用临时数组。