如何从两个向量中获得复数的向量(real& imag)

时间:2009-03-25 11:33:03

标签: c++ stl vector complex-numbers

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

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

上面的代码正确地通过编译器,但是当我想使用iterator从myComplexVector获取单个数字时,我得到错误“Undefined symbol'const_iterator'”(Borland C ++)

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

7 个答案:

答案 0 :(得分:5)

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

编辑:myComplexVector 不是一个向量,是一个复杂的。这就是为什么没有定义const_iterator的原因。

答案 1 :(得分: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中有这样的功能......

答案 2 :(得分:2)

哇,这样做不容易吗?

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

答案 3 :(得分: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] ) );
}

答案 4 :(得分: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类型。

答案 5 :(得分:0)

复数只是一对两个实数ab,它们表示复数a+bi。你究竟想用这两个载体做什么?

答案 6 :(得分:0)

我理解你的问题是你要将实部的矢量与虚部的矢量组合成一个复数矢量。

std::complex有一个模板参数,可让您选择复杂部分的数字表示(即,如果您想要基于doublefloat的复杂值,或者甚至是某些自定义数字类型...)。然后,复杂类型根据基础类型定义基本复数代数。

在你的代码中,你试图构建一个基于浮点向量的复数类型(即一个单个复数值,其实部和虚部是一个向量),这显然是错误的。相反,你想要一个类型为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 iterator以获得一般概念)。