总和的向量构造

时间:2018-12-03 23:03:37

标签: fortran fortran90

我正在尝试构建一个数组,该数组具有两个向量的点积的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 :(得分:3)

您应该使用内部函数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

答案 1 :(得分:2)

在Fortran中,您可以将向量/矩阵提升为标量幂或另一个具有相同大小的向量/矩阵,这是逐个元素地完成的。因此,您实际上不需要内部循环或临时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