0

我正在处理一个复数数组a和一个实数数组b(作为双精度数)。

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

我遇到了两个问题(这里是现场可运行的演示):

  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如何存储modulusstd::valarray<double>?

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

4

1 回答 1

0

这是我能想出的解决方案(这里是现场可运行的演示):

#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. 数组可以相乘,但不能独立。检查这些运算符。您可以将数组乘以不同的数组(或标量),但不能将某些任意数组相乘。
于 2016-07-06T00:39:56.213 回答