复数数组的操作a * = b是否有乘法版本? 换句话说,将复数数组(大量元素或未知长度)的所有元素相乘并将结果存储在复数双变量中的最有效方法是什么?
在下面的代码中,Ans1提供了正确的答案,但是,对于我的应用程序来说,解决数组的每个元素都没有意义,因为会有数百个。理想情况下,我想要一个循环(类似于Ans2),它将数组的所有元素相乘并存储答案。如果我不将Ans2作为1.0,1.0启动,则答案将为0,0,因为元素将乘以0.但是,使用1.0,1.0初始化将无法正常工作,因为我们正在处理复数。
编辑 - 我无法手动处理每个元素的原因是因为这将链接到一个更大的程序,其中数组'a'的元素将来自其他地方,并且'a'的长度将变化。
理想答案ANSWER =复杂元素[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();
}
也许这可以很容易地完成,但我错过了一些东西。提前谢谢。
答案 0 :(得分:5)
复数的乘法标识为1 + 0i
,因此您应该在循环之前将Ans2
初始化为(1,0)。
如果您不熟悉该术语,则身份是一个不会改变操作结果的值。例如,实数的加性标识为0,因为a + 0 = a
表示任何实数值a
。对于复数的乘法,(a + bi) * (1 + 0i) = (a + bi)
。在循环中,您希望将Ans2
初始化为不会影响计算结果的值,因此您使用乘法标识。
答案 1 :(得分: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)
答案 2 :(得分:0)
你可以试试这个:
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;
}