Re: Arrays Intersection



On 30 mei, 13:34, Infinity77 <andrea.gav...@xxxxxxxxx> wrote:
Hi All,

    I have received so many nice answers in this newsgroup that I
thought I could ask one more question. I am trying to find the
intersection of 2 one-dimensional integer arrays, where "intersection"
means the common elements in both arrays, i.e.:

a = [1,2,3,4,5,6]
b = [5, 6, 7]

intersection(a, b) ==> [5, 6]

At the moment I am working with Python, which handles very well sets,
lists and structures for which it's easy to define an "intersection",
but as I have many many arrays to compare, this is becoming a bit slow
so I thought to use fortran. Unfortunately, my google-fu failed me as
I couldn't find anything related to "array intersection" in Fortran.

Does anyone know what I should do in order to achieve a fast solution
to this problem?

Thank you very much for your suggestions.

Andrea.

You might use:

pack( array1, (/ (any(array1(i) == array2), i=1,size(array1)) /) )

Tis may require some explanation:
- (/ ... /) is an array constructor
- in this statement it constructs an array of logical
values where the value is true if the element from the
first array coincides with one from the other
- the result is used to extract (via pack()) only those
elements for which that condition holds.

Here is your example:

program intersect
integer, dimension(6) :: array1 = (/ 1, 2, 3, 4, 5, 6 /)
integer, dimension(3) :: array2 = (/ 5, 6, 7 /)

integer :: i

write(*,*) &
pack( array1, (/ (any(array1(i) == array2), i=1,size(array1)) /) )

end program

One tricky thing though:
As you do not know in advance how large this resulting array
is, you can best pass it on to a subroutine:

subroutine copy( array, result )
integer, dimension(:) :: array
integer, dimension(:), pointer :: result

allocate( result(1:size(array)) )
result => array
end subroutine

as otherwise you have to compute the size in advance and
allocate an array of that size.

Regards,

Arjen
.



Relevant Pages

  • Re: please help with array and search!!!
    ...   ALLOCATE)) ... in the SUBROUTINE countall ... allocatable array at must have a deferred shape. ...
    (comp.lang.fortran)
  • Re: Arrays Intersection
    ...     I have received so many nice answers in this newsgroup that I ... intersection of 2 one-dimensional integer arrays, ... I couldn't find anything related to "array intersection" in Fortran. ... After that consult a decent algorithm text for set ...
    (comp.lang.fortran)
  • Re: Arrays Intersection
    ... intersection of 2 one-dimensional integer arrays, ... I couldn't find anything related to "array intersection" in Fortran. ... you can best pass it on to a subroutine: ... subroutine intersect(array1, array2, result) ...
    (comp.lang.fortran)
  • Re: What is the name of this function...
    ... represents the rectangular intersection of two or more ranges.." ... The Union method would return the combination of two or more ranges. ... > =(some column array) ...
    (microsoft.public.excel.programming)
  • Re: Arrays Intersection
    ... intersection of 2 one-dimensional integer arrays, ... I couldn't find anything related to "array intersection" in Fortran. ...   values where the value is true if the element from the ... price of considerable algorithm complexity. ...
    (comp.lang.fortran)