.dot() product for VectorXcd in Eigen c++

.dot() product for VectorXcd in Eigen c++

本文关键字:in Eigen c++ VectorXcd for product dot      更新时间:2023-10-16

我想弄清楚这是Eigen中的一个bug还是我做错了什么。我只想求两个复向量[1,I]和[1,-i]的点积。答案是1*1 + i*(-i) = 2。但艾根给出的答案是零。参见下面的代码:

#include <iostream>
#include <sstream>
#include <vector>
#include <fstream>
#include <stdlib.h>
#include <time.h> 
#include <stdio.h>
#include <map>
#include <sys/sysinfo.h>
#include <algorithm>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std; 
int main( void ){

    VectorXcd xd0(2); 
    complex<double> c_i( 0.0 , 1.0 ); 
    xd0[0] = 1.0 ;   
    xd0[1] =  c_i; 
    VectorXcd xd0conj = xd0.conjugate();
    cout <<" vec is n" << xd0 <<endl;
    cout <<" conj vec is n" << xd0conj <<endl;
    cout << "eigen dot = " << (xd0conj).dot(xd0 ) <<endl; 
    complex<double> outVal = 0.0; 
    for( int a=0; a<xd0.size(); a++){
        outVal += xd0[a]*xd0conj[a]; 
    }
    cout << "naive dot = " << outVal<<endl;
};

来自文档:

"如果标量类型是复数,则此函数返回厄米特(半线性)点积,第一个变量为共轭线性,第二个变量为线性。"

这个产物经常被使用,例如在量子力学中。它计算conj(x)*y就是你们看到的。我猜你想要一个简单/普通的点:

cout << "eigen dot = " << xd0conj.transpose()*xd0 <<endl; 
这个输出

eigen dot = (2,0)