Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vector construction from sum

I'm trying to construct an array that has, as elements, the SUM of the dot product of two vectors. Like so:

vector

I used the following code, but I don't think it's right, so plese help.

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

Where x is the vector Xi, y is the function f, j is the power m, temp is a temporary vector containing the operation on the current element,

Thank you.

like image 460
Majd Avatar asked Dec 28 '25 19:12

Majd


2 Answers

You should use the intrinsic function sum, that takes an array and reduce it by addition. Intrinsic are pretty optimized, so they are usually recommended when they may apply.

There are plenty of syntactic ways to accomplish it, and many of them with the intrinsic sum. Here there are some of them (I am using the same notation as your image, not from your sample):

  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
like image 192
Rodrigo Rodrigues Avatar answered Dec 31 '25 09:12

Rodrigo Rodrigues


In Fortran, you can raise a vector/matrix to a scalar power or another vector/matrix having the same size, this is done element-wise. So, you don't actually need the inner loop or the temporary temp to store the partial product x**j * y. In the example below, you will get an m+1 vector, b, whose jth element is the sum of elements 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
like image 31
AboAmmar Avatar answered Dec 31 '25 07:12

AboAmmar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!