复数数组乘法

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)

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

Cal*_*leb 5

复数的乘法标识是1 + 0i,所以你应该Ans2 在循环之前初始化为(1,0).

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


Arn*_*rtz 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;
}  
Run Code Online (Sandbox Code Playgroud)

注意:我不知道你complex(1,1)是否真的想要使用的初始值 - 乘法身份是complex(1,0)