2016-09-18 2 views
0

Я хотел бы спросить, если кто-нибудь знает, почему это не работает:Умножение - Матрица на мнимую единицу

Например, пусть

SparseMatrix<int> A 

и

SparseMatrix<std::complex<float> > B 

Я хотел бы выполните следующую математику:

B = i * A

Как код:

std::complex<float> c; 
c=1.0i; 
B=A.cast<std::complex<float> >()*c; 

или эквивалент:

B=A.cast<std::complex<float> >()*1.0i; 

Я ожидаю, что все действительные значения А мнимым в B, но есть только нули, как (0,0).

Пример:

#include <Eigen/Sparse> 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 

using namespace Eigen; 
using std::cout; 
using std::endl; 

int main(int argc, char *argv[]){ 

    int rows=5, cols=5; 

    SparseMatrix<int> A(rows,cols); 
    A.setIdentity(); 


    SparseMatrix<std::complex<float> > B; 
    std::complex<float> c; 
    c=1i; 

    B=A.cast<std::complex<float> >()*1.0i; 
    //B=A.cast<std::complex<float> >()*c; 

    cout << B << endl; 

    return 0;  
} 

компилировать с: г ++ [имя] .cpp -o [имя]

Что я делаю неправильно?

Большое спасибо за помощь!

+0

Помогает ли вам использовать I вместо i? Я читал в стандарте c (и, возможно, в этом контексте это другое), что я не представляю воображаемую единицу. Или иначе, если вы не <#include complex>, который будет определять нижний регистр i? –

+0

Выше должно быть указано #include

+0

Спасибо за ваши предложения! К сожалению, я получаю те же результаты. – nik

ответ

1

Вам необходимо включить C++ 14, чтобы получить 1.0i, работающий как ожидалось. С помощью GCC или clang вам нужно добавить опцию компилятора -std=c++14.

Затем, вы можете просто сделать:

MatrixXd A = MatrixXd::Random(3,3); 
MatrixXcd B; 
B = A * 1.0i; 

То же самое с SparseMatrix.

+0

Отлично! Спасибо большое! – nik

Смежные вопросы