c++ - 计算复数的乘法

标签 c++ arrays vector multiplication complex-numbers

我最终要做的是像这样将两个复数相乘:

z1 = R1 + I1*j

z2 = R2 + I2*j

z3 = z1 * z2 = (R1*R2 - I1*I2) (R1*I2 + R2*I1)*j;

但我有两个单独的 vector ,分别表示这两个复数的实部和复数部分。所以像这样:

v1 = [R1, R2, R3, R4 ... Rn] of z1

v2 = [I1, I2, I3, I4 ... In] of z1

v1 = [R1, R2, R3, R4 ... Rn] of z2

v2 = [I1, I2, I3, I4 ... In] of z2

所以当我现在尝试计算 z3 时,我会这样做:

foo (std::vector<double> real1, std::vector<double> imag1,
     std::vector<double> real2, std::vector<double> imag2)
{
    std::vector<double> realResult;
    std::vector<double> imagResult;

    for (size_t i = 0; i < real1.size(); i++)
    {
         realResult.push_back(real1[i]*real2[i] - imag1[i]*imag2[i]);
         imagResult.push_back(real1[i]*imag2[i] + real2[i]*imag1[i]);
    }

    //And so on
}

现在,这个功能正在吃很多时间。当然还有另一种方法可以做到这一点,你能想到我可以使用的东西吗?

最佳答案

您也许可以使用 std::complex .这可能会实现您至少需要接近并且可以实现的操作。

编辑(回复评论):

我会这样做:

size_t num_items = real1.size();
std::vector<double> realResult;
realResult.reserve(num_items);
std::vector<double> imagResult;
imagResult.reserve(num_items);
for (size_t i = 0; i < num_items; ++i) {
  // lalala not re-sizeing any vectors yey!
  realResult.push_back(real1[i] * real2[i] - imag1[i] * imag2[i]);
  imagResult.push_back(real1[i] * imag2[i] + real2[i] * imag1[i]);

}

否则,如果你有一个大的输入数组并且你正在对 double 进行大量乘法运算,恐怕这可能会很慢。你能做的最好的事情就是让内存中的东西连续以获得奖励缓存点。如果不对代码进行概要分析,就不可能真正说出什么可能最有效。

关于c++ - 计算复数的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37395875/

相关文章:

c++ - 找到 4 个特定的角像素并将它们与扭曲透视一起使用

java - 将数组大小设置为来自另一个类的用户输入

c++ - 创建一个子类 vector ?

c++ - 在类构造函数中初始化一个 vector

C++,什么时候应该返回引用?

c++ - c++/c中的基数改变算法

c++ - 大数据 block 的 C++ 中的碎片 (Windows)

c++ - python 和痛饮 : Using StringIO in place of FILE*

c - 段错误(核心转储)[康威的生命游戏]

c - 删除数组中相同的项