Заполнение массива нулями в фортране без использования циклов - PullRequest
0 голосов
/ 26 августа 2018

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

eg- Для массивов -

y1=(/ 1,2,3 /)
y2=(/ 1,2,3,4,5 /)

Окончательный результат должен быть -

y1=(/ 1,2,3,0,0 /)
y2=(/ 1,2,3,4,5 /)

Я очень плохо знаком с Фортраном, и, насколько я знаю до сих пор, это можно сделать так: -

integer, allocatable :: y1(:),y2(:)
integer :: l1,l2,i
.
.
.
! some code to generate y1 and y2 here
.
.
.
l1=size(y1)
l2=size(y2)

if (l1>l2) then
    do i=l2+1,l1
        y2(i)=0
    enddo
else if (l2>l1) then
    do i=l1+1,l2
        y1(i)=0
    enddo
endif

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

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Если вас интересуют только массивы ранга 1, использование SHAPE и RESHAPE является излишним.Просто используйте функции конструктора массивов Fortran.Вы также можете использовать современную фортрановскую функцию выделения при назначении, поэтому вам не нужно перераспределять более короткий массив.

program foo
  implicit none
  integer, allocatable :: y1(:),y2(:)
  integer :: l1,l2,i
  y1 = [1, 2, 3]
  y2 = [1, 2, 3, 4, 5]
  l1 = size(y1)
  l2 = size(y2)
  if (l1 > l2) y2 = [y2, [(0,i=1,l1-l2)]]
  if (l2 > l1) y1 = [y1, [(0,i=1,l2-l1)]]
  print '(10(I0,1X))', y1
  print '(10(I0,1X))', y2
end program foo
0 голосов
/ 26 августа 2018

Вот один из способов:

y1 = RESHAPE(y1,SHAPE(y2),pad=[0])

Нет явных циклов.Как прокомментировал @VladimirF, более короткий массив должен быть перераспределен, этот подход оставляет его на усмотрение компилятора и среды выполнения.

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

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