2015-07-24 4 views
0

двумерный массив, который я имею в виду имеет такие значения, какFortran фильтр двумерный массив

1 2326 
1 2331 
1 2328 
1 2323 
2 2404 
2 2398 
2 2401 
2 2403 
3 2408 
3 2401 
3 2408 
3 2401 

Я хочу работать на всех элементах, которые имеют тот же идентификатор, в то время, как:

program filter_2d 
    integer(1000, 1000) :: my_array 
    integer :: id 

    ... 

    print *, any(my_array(1, :), id) 
end program filter_2d 

любое просто возвращает true. Как я могу фильтровать строки, которые имеют (i, 1) == 2, например?

и в качестве побочного вопроса, следует ли использовать массивы или просто идти с настраиваемым типом, который имеет целое число id и массив для хранения остальных значений (массив намного больше irl, например 10000x10000).

ответ

1

Самый простой путь является петлей и, если заявление:

program filter_2d 
    integer    :: my_array(3, 3) 
    integer, parameter :: id = 2 

    my_array = reshape([ 1, 2, 2, 2, 3, 4, 5, 6, 7 ], [3,3]) 

    do i=1,size(my_array,1) 
    if (my_array(i,1) == id) print *, my_array(i, :) 
    enddo ! i 
end program filter_2d 

Особенно если размеры становятся больше я хотел бы использовать массивы вместо производных типов. Подход ООП всегда имеет вычислительные накладные расходы, которые необходимо учитывать.

Как правило, я всегда использую структуры как можно более простые и выбираю только производные типы, если не вижу другого варианта. Это, конечно, относится только к части кода кода. Для организации симуляций, включая ввод-вывод и предварительную обработку, обычно полезно принять парадигму ООП.


Вы также можете настроить множество индексов и работать на том, что:

program filter_2d 
    integer    :: my_array(3, 3) 
    integer, parameter :: id = 2 

    integer    :: idx(size(my_array, 1)) 
    integer    :: nMatch 

    my_array = reshape([ 1, 2, 2, 2, 3, 4, 5, 6, 7 ], [3,3]) 

    nMatch = 0 
    do i=1,size(my_array,1) 
    if (my_array(i,1) == id) then 
     nMatch = nMatch + 1 
     idx(nMatch) = i 
    endif 
    enddo ! i 

    print *, my_array(idx(:nMatch),:) 
end program filter_2d 

Это, вероятно, может быть написана более элегантно, но вы получите идею ...

+0

не уверен, как любой (my_array (i, :), id) работает здесь, не предполагается ли какое-либо логическое выражение? – panosl

+0

Я не уверен, чего вы пытаетесь достичь с помощью 'any' ...' any (my_array (1, :) == id) 'будет true, если какой-либо из элементов первой строки будет' id'. Вы получаете одно истинное/ложное решение, а не набор индексов! –

+0

Я пытался использовать любой, чтобы возвращать уменьшенный массив только с строками, которые соответствовали его выражению, но я полагаю, что это невозможно? – panosl

Смежные вопросы