从总和构建向量
Vector construction from sum
我正在尝试构建一个数组,该数组的元素是两个向量的点积之和。像这样:
我用了下面的代码,但我觉得不对,请大家帮忙。
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是包含对当前元素的操作的临时向量,
谢谢。
在 Fortran 中,您可以将 vector/matrix 提升为标量幂或另一个具有相同大小的 vector/matrix,这是按元素完成的。因此,您实际上不需要内部循环或临时 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
您应该使用内部函数 sum
,它接受一个数组并通过加法对其进行归约。 Intrinsic 非常优化,因此通常会在可能适用时推荐它们。
有很多句法方法可以实现它,其中许多是内在的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
我正在尝试构建一个数组,该数组的元素是两个向量的点积之和。像这样:
我用了下面的代码,但我觉得不对,请大家帮忙。
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是包含对当前元素的操作的临时向量,
谢谢。
在 Fortran 中,您可以将 vector/matrix 提升为标量幂或另一个具有相同大小的 vector/matrix,这是按元素完成的。因此,您实际上不需要内部循环或临时 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
您应该使用内部函数 sum
,它接受一个数组并通过加法对其进行归约。 Intrinsic 非常优化,因此通常会在可能适用时推荐它们。
有很多句法方法可以实现它,其中许多是内在的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