3

a *= b复数数组的运算是否有乘法版本?换句话说,将复数数组(大量元素或未知长度)的所有元素相乘并将结果存储在复数双变量中的最有效方法是什么?

在下面的代码中,Ans1提供了正确的答案,但是,对于我的应用程序来说,处理数组的每个元素是没有意义的,因为会有数百个元素。理想情况下,我想要一个循环(类似于Ans2),将数组的所有元素相乘并存储答案。如果我不启动Ans21.0,1.0答案将是0,0元素将乘以 0。但是,初始化 with1.0,1.0也不起作用,因为我们正在处理复数。

编辑 - 我不能手动处理每个元素的原因是因为这将链接到一个更大的程序,其中数组的元素a将来自其他地方,并且长度a会有所不同。

理想情况下ANSWER = COMPLEX ELEMENT[0]*COMPLEX ELEMENT[1]*COMPLEX ELEMENT[2]*....COMPLEX ELEMENT[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();
}

也许这可以很容易地完成,但我错过了一些东西。提前致谢。

4

3 回答 3

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)

于 2013-07-08T13:58:30.467 回答
5

复数的乘法恒等式是1 + 0i,因此您应该在循环之前初始化Ans2 为 (1, 0)。

如果您不熟悉该术语,则标识是不会更改操作结果的值。例如,实数的加法恒等式是 0,因为a + 0 = a对于任何实数值a。对于复数的乘法,(a + bi) * (1 + 0i) = (a + bi). 在您的循环中,您希望初始化Ans2为一个不会影响计算结果的值,因此您使用乘法恒等式。

于 2013-07-08T13:54:03.700 回答
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;
}
于 2013-07-08T13:53:16.213 回答