2009-03-25 7 views
1

私は2つの浮動小数点ベクトルを持ち、それらを1つの複素数ベクトルにします。私は立ち往生している。イテレーターを使用しても構いませんが、私には知らされていないホイールを再発見すると確信しています。私のコードは私を正しい方向に導いてくれますか? (ボーランドC++)2つのベクトル(実数と実数)から複素数のベクトルを得る方法

typedef std::vector<float> CVFloat; 
CVFloat vA, vB; 
//fil vectors 
typedef std::complex<CVFloat> myComplexVector; 
myComplexVector* vA_Complex = new myComplexVector(vA, vB); 

上記のコードは正しくコンパイラ通過しているが、私はイテレータを使用してmyComplexVectorから単一の番号を取得したいとき、私はエラー「未定義のシンボル 『const_iteratorの』」を取得

myComplexVector::const_iterator it = vA_Complex->begin(); 

答えて

4

ここでは、実数部と虚数部が浮動小数点のベクトルである「複雑な」オブジェクトを作成しています。
あなたが実際にやりたいことは、実数部と虚数部が浮動小数点である複雑なオブジェクトのベクトルを作成することでしょうか?

編集:myComplexVectorはではありません。ベクターは複合体です。そのため、const_iteratorは定義されていません。

+0

Heh、あなたはもちろんです。それは完璧に動作します、ありがとうございます。時には、偽のアイデアで迷子になってしまうこともあります。 大きなプロジェクトの一部です。私はconvul​​tionを最適化し、私は別々に実ベクトルとimagベクトルを保持するdftの既存のクラスを使用する必要があります。 – Moyshe

+0

あなたは歓迎です:)私は助けてうれしいです。 –

0

複素数は、単に複素数a+biを示す2つの実数abのペアです。あなたは2つのベクトルで正確に何をしようとしていますか?

1

これはどんな意味がありません。

typedef std::complex<CVFloat> myComplexVector; 

きっとあなたは

typedef std::complex <float> ComplexFloat; 
typedef std::vector <ComplexFloat> CFVector; 

か何か似た意味ですか?

OUはそれを持っていたら、単にフロートベクトルを反復(と仮定すると、彼らは一致する値が含まれている)と、一back()を使用して、複素ベクトルに追加することができます。

CFVector v; 

for (int i = 0; i < vA.size(); i++) { 
    v.push_back(ComplexFloat(vA[i], vB[i])); 
} 
1

最も簡単な方法は、単にループを記述されて

myComplexVector cv; 
for(CVFloat::iterator it1=vA.begin(), end1=vA.end(), 
     it2=vB.begin(), end2=vB.end(); 
    it1!=end1 && it2 != end2; ++it1, ++it2) 
    cv.push_back(std::complex(*it1, *it2)); 

編集:...そして、myComplexVectorタイプを正しく宣言するためのNeilのアドバイスに従ってください。

2

あなたは両方のベクター、およびコンバータファンクタと出力イテレータにイテレータを取る一般的な「ジップ」関数を作成することができます

template< typename at_It1, typename at_It2, typename at_Transform, typename at_Out > 
void zip(at_It1 from1, const at_It1 to1, 
      at_It2 from2, const at_It2 to2, 
      at_Transform tranformer, 
      at_Out& av_Out) { 
    while(from1 != to1) { 
     av_Out = transformer(*from1, *from2); 
     ++av_Out; ++from1; ++from2; 
    } 
} 

struct DoubleToComplex { 
    complex<double> operator()(const double d1, const double d2) const { 
     return complex<double>(d1, d2); 
    } 
}; 



zip(vA.begin(), vA.end(), 
    vB.begin(), vB.end(), 
    DoubleToComplex(), 
    std::back_inserter(vTarget)); 

そして、私はSTLでこのような機能があるなあ...

2

これははるかに簡単ではありませんか?

vector< complex<float> > result; 
for(int i = 0; i < vA.size(); i++) { 
    result.push_back(complex<float>(vA[i], vB[i])); 
} 
+0

複雑な定義済みのすべての必要な演算子で定義済みの複雑な時間に単純なペアを複合として宣言するのはなぜですか? –

+0

あなたはsdt :: complexクラスを意味しますか?私はちょうどあなたが尋ねる前にそれが存在することを知らなかった。 – sharptooth

0

私はあなたが複素数のベクトルに虚部のベクトルと実数部のベクトルを結合したいあなたの質問を理解しています。

std::complexは(あなたは、複雑なdoubleまたはfloatに基づいて値、あるいはいくつかのカスタム番号の種類をしたい場合は...すなわち)あなたは、複合体の部分の数値represenationを選んだことができます1つのテンプレートパラメータがあります。複合型は、基底型の観点から基本複素代数を定義します。あなたのコードで

あなたは山車のベクトルは明らかに間違っている、(実部と虚部のベクトルであることを持つ、すなわち単一複素数値)に基づいて複合型を構築しようとしています。それはにISNほとんどの場合

  • // ... 
    typedef std::vector<std::complex<float> > floatComplexVector; 
    floatComplexVector vA_Complex; // No need to 'new' !? 
    
    for (CVFLoat::const_iterator itA = vA.begin(), itB = vB.begin(); 
        itA != vA.end() && itB != vB.end(); 
        ++itA,++itB) 
        vA_Complex.push_back(std::complex<float>(*itA, *itB)); 
    

    備考:代わりに、あなたはあなたが好きな何かをしなければならないと思いfloat型の複素数

    ベクトルをしたいですヒープ上にベクトルなどのコンテナを作成するのに必要なもの(つまり、newを使用して)これを避けるようにしてください。残念なことに、C++標準ライブラリは、より洗練された解を可能にする組み合わせイテレータ(すなわち、一般的な考え方についてはBoost Zip iteratorを参照)を含んでいない。

関連する問題