2015-07-29 2 views
0

Я пытаюсь выяснить, является ли это ошибкой в ​​Eigen или что-то, что я делаю неправильно. Я просто хочу, чтобы произведение точек двух комплексных векторов [1, i] и [1, -i]. Ответ 1 * 1 + i * (- i) = 2. Но Eigen дает нуль в качестве ответа. См код ниже:.dot() продукт для VectorXcd в Eigen C++

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

}; 

ответ

2

Из documentation:

" Если тип скаляр комплексные числа, то эта функция возвращает эрмитовой (полуторалинейное) скалярное произведение, сопряженно-линейный по первой переменной и линейной во второй переменной. "

Этот продукт часто используется, например, в quantum mechanics. Он вычисляет conj (x) * y, что и есть то, что вы видите. Я предполагаю, что вы хотите простую/обычную точку:

cout << "eigen dot = " << xd0conj.transpose()*xd0 <<endl; 

Это выводит

eigen dot = (2,0) 
Смежные вопросы