Построение вектора из суммы - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь создать массив, который имеет в качестве элементов сумму SUM точечного произведения двух векторов.Вот так:

vector

Я использовал следующий код, но я не думаю, что это правильно, поэтому, пожалуйста, помогите.

do j = 0, m
do i = 1, N
temp(i) = (x(i)**j)*y(i)
b(j) = vectorsum(temp)
end do
end do 

Где x - этовектор Xi, y - функция f, j - степень m, temp - временный вектор, содержащий операцию над текущим элементом,

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

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

Существует множество синтаксических способов достижения этого, и многие из них имеют встроенный sum.Вот некоторые из них (я использую ту же запись, что и ваше изображение, а не из вашего образца):

  implicit none
  integer, parameter :: m=5,n=3
  integer :: i, j, x(0:n), f(0:n), b(0:m)

  x = [0,1,2,3]
  f = [0,1,2,3]

  ! using array implied-do construction inside sum
  do i = 0,m
    b(i) = sum([(x(j)**i * f(j), j=0,n)])
  end do
  print *, b  ! output: 6 14 36 98 276 794


  ! using Fortran's whole array operations
  do i = 0,m
    b(i) = sum(x**i * f)
  end do
  print *, b  ! output: 6 14 36 98 276 794

  ! using implied-do constructor outside, without explicit do    
  b = [(sum(x**i * f), i=0,m)]
  print *, b  ! output: 6 14 36 98 276 794

end
0 голосов
/ 04 декабря 2018

В Фортране вы можете повысить вектор / матрицу до скалярной степени или другого вектора / матрицы, имеющих такой же размер, это делается поэлементно.Таким образом, вам на самом деле не нужен внутренний цикл или временный temp для хранения частичного продукта x**j * y.В приведенном ниже примере вы получите вектор m+1, b, элемент которого jth является суммой элементов x^j * y.

program test_sumvec
   implicit none
   integer, parameter :: m = 10, N = 10 
   real    :: x(0:N), y(0:N), b(0:m)
   integer :: j 

   x = 2
   y = 1

   do j = 0, m
      b(j) = sum(x**j * y)
   end do

   print *, b(0:4)

end program test_sumvec
...