我正在使用一组复数a
和一组实数b
(作为double)。
typedef std::complex<double> Complex;
std::valarray<Complex> a(1024);
std::valarray<double> b(1024);
std::valarray<double> modulus = std::abs(a); // problem 1
std::valarray<Complex> modulus2 = std::abs(a); // this works but uses 2 times more memory :(
std::valarray<Complex> c = a * b; // problem 2
我遇到两个问题(实时runnable demo here):
出于内存管理的目的,由于绝对值(或“模数”)是实数,因此应该可以将其存储为std::valarray<double>
。但在这里它不起作用:有一个错误conversion from 'std::_Expr<std::_UnClos<std::_Abs, std::_ValArray, std::complex<double> >, std::complex<double> >' to non-scalar type 'std::valarray<double>' requested
。 如何将modulus
存储为std::valarray<double>
?
应该可以将a
乘以b
并将结果存储为复数数组。但是有一个错误:no match for 'operator*' (operand types are 'std::valarray<std::complex<double> >' and 'std::valarray<double>')
。 如何正确地进行数组乘法?
答案 0 :(得分:0)
以下是我可以提出的解决方案(实时runnable demo here):
#include <valarray>
#include <complex>
typedef std::complex<double> Complex;
int main()
{
std::valarray<Complex> a(1024);
std::valarray<double> b(1024);
// Solution to problem 1
std::valarray<double> modulus(a.size());
auto mod = std::abs(a);
for (size_t i=0;i<mod.size();i++) {
modulus[i] = std::abs(mod[i]);
}
std::valarray<Complex> modulus2 = std::abs(a); // this works but uses 2 times more memory :(
std::valarray<Complex> c = a * b; // problem 2
// Solution to problem 2
std::valarray<Complex> b2(1024);
std::valarray<Complex> c2(a);
c *= b2;
}
不幸的是@Basj遇到了从易于使用Python到C ++的问题(我也遇到了这个问题)。但你得到一些,你松了一些。
std::abs()
返回元素的绝对值,作为与参数相同类型的valarray
。因此,由于您已将参数作为valarray<double>
传递,因此无法将其直接分配给valarray<Complex>
。