【问题标题】:How to get Vector of Complex numbers from two vectors (real & imag)如何从两个向量(实数和虚数)中获取复数向量
【发布时间】:2009-03-25 11:33:03
【问题描述】:

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

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();

【问题讨论】:

    标签: c++ stl vector complex-numbers


    【解决方案1】:

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

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

    【讨论】:

    • 嘿,你当然是对的。效果很好,谢谢:) 有时很容易迷失在一些虚假的想法中。它是更大项目的一部分。我优化了抽搐,我必须使用现有的 dft 类,它分别保存实向量和图像向量。
    【解决方案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 中有这样的功能...

    【讨论】:

      【解决方案3】:

      为什么不做起来容易得多?

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

      【讨论】:

      • 为什么在复杂已经定义了所有必要的运算符重载的时候声明简单对是复杂的?
      • 你的意思是 sdt::complex 类?在你问之前我只是不知道它存在。
      【解决方案4】:

      最简单的方法就是写循环

      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】:

        这没有任何意义:

        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] ) );
        }
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            我了解您希望将实部向量与虚部向量组合成复数向量的问题。

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

            在您的代码中,您试图构建一个基于浮点向量的复杂类型(即具有实部和虚部为向量的 single 复值),这显然是错误的。相反,您需要一个 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)尽量避免这种情况。

            • 1234563 /li>

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多