2016-07-05 7 views
0

Ich arbeite mit einem Array von komplexen Zahlen a und ein Array von reellen Zahlen b (als Doppel).Arbeiten mit Arrays von reellen Zahlen und komplexen Zahlen

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 

begegne mir zwei Probleme (live runnable demo here):

  1. Für Speicherverwaltung Zweck als der absoluten Wert (oder "Modul") ist eine reelle Zahl, soll es möglich sein, Speichern Sie es als std::valarray<double>. Aber hier funktioniert es nicht: Es gibt einen Fehler conversion from 'std::_Expr<std::_UnClos<std::_Abs, std::_ValArray, std::complex<double> >, std::complex<double> >' to non-scalar type 'std::valarray<double>' requested. Wie wird modulus als std::valarray<double> gespeichert?

  2. Es sollte möglich sein, a durch b zu multiplizieren und das Ergebnis als ein Array komplexer Zahlen zu speichern. Aber da ist dieser Fehler: no match for 'operator*' (operand types are 'std::valarray<std::complex<double> >' and 'std::valarray<double>'). Wie wird diese Multiplikation von Arrays richtig gemacht?

+1

'std :: valarray' ist nicht ganz der Höhepunkt von C++. Man könnte sogar sagen, das Komitee hat das vermasselt. –

+0

@BaummitAugen Ich benutzte das, weil ich in der Lage sein wollte, Dinge wie 'c = a * b' zu tun, wo a und b Arrays sind, wie ich es in Python mit numpy machen würde ... Denkst du, ich sollte es benutzen etwas anderes? – Basj

+0

Wenn ich du wäre, würde ich nach einer ordentlichen Bibliothek für lineare Algebra suchen. Einfache Suche mit Ihrer bevorzugten Suchmaschine wird Ihnen bessere Alternativen bieten. (Ich stimme voll und ganz zu, dass Ihr Code funktionieren sollte, wenn 'valarray' gesund war.) –

Antwort

0

Hier ist die Lösung, die ich tun konnte (live 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 Sie in das Problem lief von leicht geht Python zu C++ zu verwenden (I in Leider laufen diese Wand auch). Aber du bekommst welche, du verlierst etwas.

  1. std::abs() liefert den Absolutwert der Elemente als valarray des gleichen Typs wie das Argument. Daher können Sie es nicht direkt valarray<double> zuweisen, da Sie das Argument als valarray<Complex> übergeben haben.
  2. Arrays könnten multipliziert werden, aber nicht unabhängig. Überprüfen Sie these operators. Sie können Ihr Array durch ein anderes Array (oder Skalar) multiplizieren, aber nicht einige willkürliche Arrays.
Verwandte Themen