2013-07-08 84 views
3

對於複數陣列,操作a * = b是否存在乘法版本? 換句話說,將複數(大量元素或未知長度)數組中的所有元素相乘並將結果存儲在複雜雙變量中的最有效方法是什麼?複數乘法陣列乘法

在下面的代碼中,Ans1提供了正確的答案,但是,對於我的應用程序,它將不會有意義地處理數組中的每個元素,因爲將會有數百個元素。理想情況下,我想要一個循環(與Ans2類似),它將數組的所有元素相乘並存儲答案。如果我不將Ans2初始化爲1.0,1.0,則答案將爲0,0,因爲這些元素將乘以0.然而,使用1.0,1.0進行初始化不會在我們處理複數時起作用。

編輯 - 我無法手動解決每個元素的原因是因爲這將鏈接到一個更大的程序,其中數組'a'的元素將來自其他地方,並且'a'的長度將會變化。

理想ANSWER =複雜元素[0] *複雜元素[1] 複雜元素[2] ....複雜元素[n]的

/* 
     Complex Array Multiplication 
    */ 

    #include <complex> 
    #include <iostream> 
    #include <cmath> 

    using namespace std; 

    int main() 
    { 
     int n = 3; 
     complex<double> Ans1, Ans2(1.0,1.0); 

     complex<double> a[n]; 

     a[0] = complex<double>(1.0, 1.5); 
     a[1] = complex<double>(-1.0, 1.5); 
     a[2] = complex<double>(1.0, -1.5); 

     Ans1 = (a[0]*a[1]*a[2]); 
     cout << "\nAns1 = " << Ans1; 

     for (int i =0; i < n; i++) { 
      Ans2 = Ans2 * a[i]; 
     } 

     cout << "\nAns2 = " << Ans2; 

     getchar(); 
    } 

也許這可以非常容易地但我做錯過了一些東西。提前致謝。

+2

乘「數「對於今天的計算機來說,複雜的價值觀實際上並不是一個挑戰......」 – filmor

+0

「對於我的應用程序來說,它不會對數組中的每個元素都有意義,因爲將會有數百個」你在衝卡上寫這個程序嗎? – djechlin

+0

確實如此,但必須手動鍵入每個元素,就像我爲Ans1所做的那樣,可能不是使用當今計算機的最有效方式。我剛剛創建了數組A來填充值,但對於我的應用程序,這些值將來自其他地方。 – user2550888

回答

5

的乘法單位對複數爲1 + 0i,所以你應該初始化Ans2到(1,0)的循環之前。

如果您不熟悉該術語,則標識是不會更改操作結果的值。例如,實數的加法標識爲0,因爲a + 0 = a對於任何實際值a。用於複數乘法,(a + bi) * (1 + 0i) = (a + bi)。在你的循環中,你想將Ans2初始化爲一個不會影響計算結果的值,所以你使用乘法標識。

+0

謝謝,正是我在找的! – user2550888

+0

不,問題,很樂意幫忙。 – Caleb

0

你可以試試這個:

if (n>=2) 
{ 
    complex<double> ans3 = a[0]*a[1]; 
    for (unsigned int i = 2; i < n; ++i) 
    { 
     ans3 *= a[i]; 
    } 
    cout << "ans3 = " << ans3<<std::endl; 
} 
5

首先,行complex<double> a[n];是無效的C++,因爲n不是一個編譯時常量 - 它需要(至少在C++ 14之前)。您的編譯器可能正在實施VLA,但這些不是標準的一部分(但)。

換句話說,將複數(大量元素或未知長度)數組的所有元素相乘並將結果存儲在複雜雙變量中的最有效方法是什麼?

你可以用std::accumulate去:

#include <complex> 
#include <iostream> 
#include <cmath> 
#include <algorithm> //accumulate 
#include <functional> //multiplies 

using namespace std; 

int main() 
{ 
    cons static int n = 3; //compiletime constant 

    complex<double> a[n]; 

    a[0] = complex<double>(1.0, 1.5); 
    a[1] = complex<double>(-1.0, 1.5); 
    a[2] = complex<double>(1.0, -1.5); 

    //define variables when they are needed 

    //alternative 1: using std::multiplies 
    auto Ans1 = std::accumulate(begin(a), end(a), complex<double>{1}, multiplies<complex<double>>{}); 
    cout << "\nAns1 = " << Ans1; 

    //alternative 2: using a C++11 lambda 
    auto Ans2 = std::accumulate(begin(a), end(a), complex<double>{1.0,1.0}, [](complex<double> a, complex<double> b) {return a*b;}) 
    cout << "\nAns2 = " << Ans2; 

    //alternative 3: using a C++14 templated lambda 
    auto Ans3 = std::accumulate(begin(a), end(a), complex<double>{1.0,1.0}, [](auto a, auto b) {return a*b;}) 
    cout << "\nAns3 = " << Ans3; 
} 

注:我不知道,如果complex(1,1)真的是你想要去的初始值 - 乘法身份是complex(1,0)

+0

感謝您的全面回覆。我不知道之前的乘法身份,並解決了問題:) – user2550888