1

我有两个浮点向量,我希望它们成为一个复数向量。我被困住了。我不介意使用迭代器,但我相信它会重新发现我不知道的轮子。我的代码是否引导我朝着正确的方向前进?

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'”(Borland C++)

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

7 回答 7

5

在这里,您正在创建一个“复杂”对象,其实部和虚部是浮点数的向量。
也许您真正想做的是创建一个由实部和虚部是浮点数的复杂对象组成的向量?

编辑: myComplexVector不是向量,是复杂的。这就是为什么 a const_iteratorfor it 没有被定义。

于 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;

或类似的东西?

一旦你有了它,你可以简单地迭代浮点向量(假设它们包含匹配值)并使用 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

复数只是一对两个实数ab表示复数a+bi。你到底想用这两个向量做什么?

于 2009-03-25T11:37:22.083 回答
0

我理解您想将实部向量与虚部向量组合成复数向量的问题。

std::complex有一个模板参数,可让您选择复杂部分的数字表示(即,如果您想要基于甚至某些自定义数字类型的复杂值double...... 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++ 标准库不包含组合迭代器(即“自动”组合两个序列的组合迭代器),这将允许更优雅的解决方案(请参阅Boost Zip 迭代器了解一般想法)。

于 2009-03-25T12:07:49.297 回答