Элементное умножение двух векторов в С++

Вопрос:Я пытаюсь выполнить следующую математическую операцию с двумя векторами: v1 = [a1][a2][a3][a4][a5] v2 = [b1][b2][b3][b4]b5] Хотите вычислить: v = [a2*b2][a3*b3][a4*b4][a5*b5] Обратите внимание, что мне не нужен первый элемент в новом векторе. Мне было интересно, есть ли более эффективный (однострочный) способ умножить (по элементам) два вектора в С++, чем на for-loop (используя push back). Мой текущий

Вопрос:

Я пытаюсь выполнить следующую математическую операцию с двумя векторами:

v1 = [a1][a2][a3][a4][a5] v2 = [b1][b2][b3][b4]b5]

Хотите вычислить:

v = [a2*b2][a3*b3][a4*b4][a5*b5]

Обратите внимание, что мне не нужен первый элемент в новом векторе.

Мне было интересно, есть ли более эффективный (однострочный) способ умножить (по элементам) два вектора в С++, чем на for-loop (используя push back). Мой текущий подход таков:

for(long i=1;i < v1.size();++i){ v.push_back(v1[i]*v2[i]); }

Я также пробовал следующее:

for (long i = 1; i < v1.size(); ++i){ v[i-1] = v1[i]*v2[i]; }

Любые предложения?

Лучший ответ:std::transform( v1.begin()+1, v1.end(), v2.begin()+1, v.begin(), // assumes v1,v2 of same size > 1, // v one element smaller std::multiplies<int>() ); // assumes values are ‘int’

Вы можете заменить v.begin() на std::back_inserter(v), если v пуст, вы должны reserve() сохранить память заранее, чтобы избежать множественных распределений.

Ответ №1

Вы можете посмотреть std:: valarray. Он предназначен для математических операций над каждым элементом массива.

Оцените статью
Добавить комментарий