复数数组乘法
Complex number array multiplication
对于复数数组,运算a *= b
有乘法版本吗?换句话说,将复数数组中的所有元素(大量元素或长度未知)相乘并将结果存储在复数双变量中最有效的方法是什么?
在下面的代码中,Ans1
提供了正确的答案,但是,对于我的应用程序来说,寻址数组的每个元素是没有意义的,因为数组中会有数百个元素。理想情况下,我希望有一个循环(类似于Ans2
),它将数组的所有元素相乘并存储答案。如果我不将Ans2
初始化为1.0,1.0
,则答案将是0,0
,因为元素将乘以0。然而,使用1.0,1.0
初始化也不起作用,因为我们正在处理复数。
EDIT-我无法手动寻址每个元素的原因是,这将链接到一个更大的程序,其中数组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();
}
也许这可以很容易地完成,但我错过了一些东西。提前谢谢。
复数的乘法恒等式是1 + 0i
,因此应该在循环之前将Ans2
初始化为(1,0)。
如果您不熟悉这个术语,标识是一个不会更改操作结果的值。例如,实数的加性恒等式是0,因为对于任何实数值a
,a + 0 = a
。对于复数乘法,(a + bi) * (1 + 0i) = (a + bi)
。在循环中,您希望将Ans2
初始化为一个不会影响计算结果的值,因此使用乘法恒等式。
首先,行complex<double> a[n];
不是有效的C++,因为n不是compiletime常量-它需要是(至少在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)
你可以试试这个:
if (n>=2)
{
complex<double> ans3 = a[0]*a[1];
for (unsigned int i = 2; i < n; ++i)
{
ans3 *= a[i];
}
cout << "answers3 = " << ans3<<std::endl;
}
- 输出没有重复元素的动态数组(收缩数组)C++
- 将字符串转换为无符号字符数组/字节数组
- 检查彩虹数组(检查数组的反向样式是否与自身匹配)
- 如何创建对齐的数组 c++ 数组?
- 查找数组中数组元素的重复出现?
- C++释放带有子数组的数组的内存分配
- 返回一个数组,该数组包含数组中的数量,该数组数量较小或等于给定数组中的元素
- 通过键盘输入字符串数组和 int 数组的数组大小
- 如何在C 中创建类似于Python的Numpy数组的数组
- 无法获取数组内数组的总和
- C4838 警告,包含常量字符* 数组的数组初始化
- 连接数组,数组 1 内存消失C++
- 如何在C++中创建二维数组的数组
- 获取字符数组C++数
- 2D数组中数组下标的类型"int[int]"无效
- C 模板类动态数组的数组到数组
- 结构数组的数组
- 如何制作具有动态大小的数组?动态数组的一般用法(可能还有指针)
- 对象的数组-STD ::数组 - 构造函数初始化问题
- std ::数组与数组性能