Векторное построение из суммы

63
4

Я пытаюсь построить массив, который имеет в качестве элементов 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 - временный вектор, содержащий операцию над текущим элементом,

Спасибо.

спросил(а) 2021-01-25T15:55:08+03:00 4 месяца, 4 недели назад
1
Решение
117

Вы должны использовать внутреннюю 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 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

ответил(а) 2021-01-25T15:55:08+03:00 4 месяца, 4 недели назад
45

В 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

ответил(а) 2021-01-25T15:55:08+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема