Копирование из массива A элементов, которые не находятся в массиве B - PullRequest
0 голосов
/ 15 октября 2018

Предположим, A - это одномерный массив неповторяющихся целых чисел, и предположим, что B представляет правильное подмножество A.Есть ли в Фортране однострочник, возможно, с использованием масок для выбора элементов A, которых нет в B?Я имею в виду, что я хочу получить теоретическое дополнение B по отношению к A.

Например, учитывая A = [ 0, 1, 2, 3, 4, 5 ] и B = [ 1, 2, 4 ], дайте мне C = [ 0, 3, 5 ].

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

1 Ответ

0 голосов
/ 15 октября 2018

Есть ли в Фортране однострочник, возможно, с использованием масок для выбора элементов A, которых нет в B?

Да, есть:

pack(a, [(all(b /= a(i)), i=1, size(a))])

Или эквивалент:

pack(a, .not.[(any(b == a(i)), i=1, size(a))])

Однако имейте в виду комментарии как @francescalus, так и @HighPerformanceMark, по поводу зачем вам однострочник? :

  • Для ясности: эта черта достаточно ясна в своем намерении, если честно.В этом случае пользовательская функция / оператор может не понадобиться, за исключением случаев, когда вы делаете это много раз или хотите скрыть другую (более эффективную, но не однострочную) реализацию.
  • Для производительности: a(i) == bсоздает массив временной маски size(b) и выполняет для него 1 обход списка (сокращение) для каждого элемента в a.Затем он создает временный массив размером size(a) в качестве маски для функции pack и пересекает его (сокращение), чтобы создать массив результатов с окончательным размером.Вы можете легко придумать более производительный алгоритм, если он того стоит (очень большие массивы).

Совет: Возможно, вы захотите, чтобы выделяемый массив сохранял результат, если вы этого не сделаете.заранее знать размер результирующего массива (здесь была бы удобна функция автоматического выделения массива в Fortran 2003).Другой вариант - передать в качестве третьего аргумента функции pack массив массивов с размером minimun size(a).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...