复数数组乘法

时间:2013-07-08 13:43:22

标签: 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();
    }

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

3 个答案:

答案 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;
}