2016-07-05 9 views
0

複素数の配列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 

Iは、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があります。 modulusstd::valarray<double>として保存するには?

  2. 複素数の配列としてbによってaを乗算し、結果を保存することが可能であるべきです。しかし、このエラーがあります:no match for 'operator*' (operand types are 'std::valarray<std::complex<double> >' and 'std::valarray<double>')アレイの乗算を正しく行うにはどうすればいいですか?ここで

+1

'std :: valarray'はC++の頂点ではありません。委員会はこれを批判したともいえます。 –

+0

@BaummitAugen私は、aとbが配列である 'c = a * b'のような高水準の処理をしたいと思ったので、これを使用しました。私はnumpyでPythonで行います。何か? – Basj

+0

私があなただったら、まともな線形代数ライブラリを探します。あなたのお気に入りの検索エンジンで簡単に検索すると、より良い選択肢が得られます。 (私は 'valarray'が正気だったらあなたのコードがうまくいくはずです)。 –

答えて

0

私が思い付くことができソリューションは、(runnable demo hereが住んでいる)である:あなたがC++にはPythonを使用して簡単に行くことの問題に遭遇した@Basj

#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;          
} 

は、残念ながら、(私はに実行しますこの壁も)。しかし、あなたはいくつかを得る、あなたはいくつか緩い。

  1. std::abs()引数と同じタイプのvalarrayなどの要素の絶対値を返します。結果として、引数をvalarray<Complex>として渡したため、valarray<double>に直接割り当てることはできません。
  2. 配列を乗算することはできますが、独立して行うことはできません。 these operatorsを確認してください。 の配列に、異なる配列(またはスカラー)を掛けることはできますが、いくつかの配列は掛け合わせることはできません。
関連する問題