1

浮動小数点数のベクトルが2つあり、それらを複素数の1つのベクトルにします。私は立ち往生しています。イテレータを使用してもかまいませんが、知らされていないホイールを再発見することになると確信しています。私のコードは私を正しい方向に導いていますか?

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

上記のコードはコンパイラを正しく通過していますが、イテレータを使用してmyComplexVectorから単一の数値を取得したい場合、エラー「Undefined symbol'const_iterator'」(Borland C ++)が発生します。

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

7 に答える 7

5

ここでは、実数部と虚数部がフロートのベクトルである「複雑な」オブジェクトを作成しています。
たぶん、あなたが実際にやりたいのは、実数部と虚数部がフロートである複雑なオブジェクトのベクトルを作成することですか?

編集:myComplexVectorはベクトルではなく、複雑です。そのため、const_iteratorforは定義されていません。

于 2009-03-25T11:37:20.790 に答える
2

両方のベクトルへの反復子、および変換ファンクターと出力反復子を取得する一般的な「zip」関数を作成できます。

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にそのような機能があればいいのに...

于 2009-03-25T11:40:51.547 に答える
2

もっと簡単にやってみませんか?

vector< complex<float> > result;
for( int i = 0; i < vA.size(); i++ ) {
    result.push_back( complex<float>( vA[i], vB[i] ) );
}
于 2009-03-25T11:44:40.727 に答える
1

これは意味がありません:

typedef std::complex<CVFloat> myComplexVector;

確かにあなたは意味します

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

または同様のもの?

取得したら、floatベクトルを反復処理し(一致する値が含まれていると想定)、push_back()を使用して複雑なベクトルに追加できます。

CFVector v;

for ( int i = 0; i < vA.size(); i++ ) {
  v.push_back( ComplexFloat( vA[i], vB[i] ) );
}
于 2009-03-25T11:39:36.493 に答える
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));

編集:...そしてNeilのアドバイスに従って、myComplexVectorタイプを適切に宣言します。

于 2009-03-25T11:39:46.120 に答える
0

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

于 2009-03-25T11:37:22.083 に答える
0

実数部のベクトルと虚数部のベクトルを組み合わせて複素数のベクトルにしたいという質問を理解しました。

std::complexdouble複素数の部分の数値表現を選択できる1つのテンプレートパラメータがあります(つまり、またはfloatカスタム数値タイプに基づく複素数の値が必要な場合...)。次に、複素数型は、基礎となる型の観点から基本的な複素代数を定義します。

あなたのコードでは、floatのベクトルに基づいて複合型を構築しようとしています(つまり、実数部と虚数部がベクトルである単一の複素数値)。これは明らかに間違っています。代わりに、 float型の複素数のベクトルが必要です

次のようなことをする必要があります。

// ...
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));

備考:

  • ほとんどの場合、ヒープ上にベクトルなどのコンテナを作成する必要はありません(つまり、を使用しますnew)。これは避けてください。

  • 残念ながら、C ++標準ライブラリには、より洗練されたソリューションを可能にする結合イテレータ(つまり、2つのシーケンスを「自動的に」結合するイテレータ)が含まれていません(一般的な考え方については、 Boost Zipイテレータを参照してください)。

于 2009-03-25T12:07:49.297 に答える