use*_*888 3 c++ complex-numbers
复数数组的操作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();
}
Run Code Online (Sandbox Code Playgroud)
也许这可以很容易地完成,但我错过了一些东西.提前致谢.
复数的乘法标识是1 + 0i,所以你应该Ans2 在循环之前初始化为(1,0).
如果您不熟悉该术语,则标识是不会更改操作结果的值.例如,实数的加性同一性是0,因为a + 0 = a对于任何实际值a.对于复数的乘法,(a + bi) * (1 + 0i) = (a + bi).在循环中,您希望初始化Ans2为不会影响计算结果的值,因此您使用乘法标识.
首先,该行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;
}
Run Code Online (Sandbox Code Playgroud)
注意:我不知道你complex(1,1)是否真的想要使用的初始值 - 乘法身份是complex(1,0)