Умножение массива комплексных чисел

Существует ли версия умножения для операции a * = b для массивов комплексных чисел?
Другими словами, каков наиболее эффективный способ умножения всех элементов массива комплексных чисел (большого числа элементов или неизвестной длины) и сохранения результата в сложной двойной переменной?

В следующем коде Ans1 дает правильный ответ, однако для моего приложения не имеет смысла обращаться к каждому элементу массива, так как их будет сотни. В идеале я хотел бы иметь цикл (что-то похожее на Ans2), который умножает все элементы массива и хранит ответ. Если я не инициирую Ans2 как 1.0,1.0, ответ будет 0,0, так как элементы будут умножены на 0. Однако инициализация с 1.0,1.0 не будет работать, так как мы имеем дело с комплексными числами.

РЕДАКТИРОВАТЬ — Причина, по которой я не могу обратиться к каждому элементу вручную, заключается в том, что он будет связан с более крупной программой, в которой элементы массива «а» будут откуда-то еще, а длина «а» будет меняться.

В идеале ОТВЕТ = КОМПЛЕКСНЫЙ ЭЛЕМЕНТ [0] * КОМПЛЕКСНЫЙ ЭЛЕМЕНТ [1]КОМПЛЕКСНЫЙ ЭЛЕМЕНТ [2]….КОМПЛЕКСНЫЙ ЭЛЕМЕНТ [n]

    /*
Complex Array Multiplication
*/

#include <complex>
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
int n = 3;
complex<double> Ans1, Ans2(1.0,1.0);

complex<double> a[n];

a[0] = complex<double>(1.0, 1.5);
a[1] = complex<double>(-1.0, 1.5);
a[2] = complex<double>(1.0, -1.5);

Ans1 = (a[0]*a[1]*a[2]);
cout << "\nAns1 = " << Ans1;

for (int i =0; i < n; i++) {
Ans2 = Ans2 * a[i];
}

cout << "\nAns2 = " << Ans2;

getchar();
}

Может быть, это можно сделать очень легко, но я что-то упустил. Заранее спасибо.

3

Решение

Мультипликативный тождество для комплексных чисел 1 + 0i, так что вы должны инициализировать Ans2 до (1, 0) до вашего цикла.

Если вы не знакомы с этим термином, идентификатор — это значение, которое не меняет результат операции. Например, аддитивная идентичность для действительных чисел равна 0, потому что a + 0 = a для любой реальной стоимости a, Для умножения комплексных чисел, (a + bi) * (1 + 0i) = (a + bi), В вашем цикле вы хотите инициализировать Ans2 до значения, которое не повлияет на результат вычисления, поэтому вы используете мультипликативный тождество.

5

Другие решения

Прежде всего, линия complex<double> a[n]; не является допустимым C ++, потому что n не является константой времени компиляции — это должно быть (по крайней мере, до C ++ 14). Ваш компилятор может реализовывать VLA, но они не являются частью стандарта (пока).

Другими словами, каков наиболее эффективный способ умножения всех элементов массива комплексных чисел (большого числа элементов или неизвестной длины) и сохранения результата в сложной двойной переменной?

Вы могли бы пойти с std::accumulate:

#include <complex>
#include <iostream>
#include <cmath>
#include <algorithm> //accumulate
#include <functional> //multiplies

using namespace std;

int main()
{
cons static int n = 3; //compiletime constant

complex<double> a[n];

a[0] = complex<double>(1.0, 1.5);
a[1] = complex<double>(-1.0, 1.5);
a[2] = complex<double>(1.0, -1.5);

//define variables when they are needed

//alternative 1: using std::multiplies
auto Ans1 = std::accumulate(begin(a), end(a), complex<double>{1}, multiplies<complex<double>>{});
cout << "\nAns1 = " << Ans1;

//alternative 2: using a C++11 lambda
auto Ans2 = std::accumulate(begin(a), end(a), complex<double>{1.0,1.0}, [](complex<double> a, complex<double> b) {return a*b;})
cout << "\nAns2 = " << Ans2;

//alternative 3: using a C++14 templated lambda
auto Ans3 = std::accumulate(begin(a), end(a), complex<double>{1.0,1.0}, [](auto a, auto b) {return a*b;})
cout << "\nAns3 = " << Ans3;
}

Примечание: я не знаю, если complex(1,1) действительно начальное значение, с которым вы хотите пойти — мультипликативная идентичность complex(1,0)

5

Вы можете попробовать это:

if (n>=2)
{
complex<double> ans3 = a[0]*a[1];
for (unsigned int i = 2; i < n; ++i)
{
ans3 *= a[i];
}
cout << "ans3 = " << ans3<<std::endl;
}
0