使用实数和复数的数组

时间:2016-07-05 23:10:44

标签: c++ arrays complex-numbers valarray

我正在使用一组复数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):

  1. 出于内存管理的目的,由于绝对值(或“模数”)是实数,因此应该可以将其存储为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>

  2. 应该可以将a乘以b并将结果存储为复数数组。但是有一个错误:no match for 'operator*' (operand types are 'std::valarray<std::complex<double> >' and 'std::valarray<double>')如何正确地进行数组乘法?

1 个答案:

答案 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 ++的问题(我也遇到了这个问题)。但你得到一些,你松了一些。

  1. std::abs()返回元素的绝对值,作为与参数相同类型的valarray。因此,由于您已将参数作为valarray<double>传递,因此无法将其直接分配给valarray<Complex>
  2. 阵列可以成倍增加,但不是独立的。检查these operators。您可以将您的数组乘以不同的数组(或标量),但不是某些任意数组。