2016-07-05 35 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 

我遇到兩個問題(住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. 應該可以通過b乘以a並將結果存儲爲複數的陣列。但有這個錯誤:no match for 'operator*' (operand types are 'std::valarray<std::complex<double> >' and 'std::valarray<double>')如何正確地進行數組的乘法運算?

+1

'std :: valarray'不是C++的巔峯之作。人們甚至可以說,委員會搞砸了。 –

+0

@BaummitAugen我之所以這樣做,是因爲我想能夠做像'c = a * b'這樣的高級事物,其中a和b是數組,就像我在Python中使用numpy所做的那樣...您認爲我應該使用別的東西? – Basj

+0

如果我是你,我會尋找一個體面的線性代數庫。用你最喜歡的搜索引擎進行簡單的搜索會給你更好的選擇。 (我完全同意你的代碼應該可以工作,如果'valarray'是理智的。) –

回答

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<Complex>傳遞,因此無法將其直接分配給valarray<double>
  2. 數組可以相乘,但不能獨立。檢查these operators。你可以將乘以乘以不同的數組(或標量),但不能使用任意數組。