Eigen3 Vector zu Standard-Array (C++) wandeln

Gast #3694561
Lesenswert?

Hallo,

ich versuche mich gerade in die Eigen3 C++ Bibliothek einzuarbeiten.
Zum Import von Standard C++ Arrays finde ich die Funktion MAP, aber wie 
kann ich einen Eigen3 Vector umcasten um ihn als Standard -Double-Array 
weiterzuverwenden?

Im folgenden Beispiel soll ein Testmuster berechnet werden und mit QWT 
geplottet werden:

so geht es
1
//#include "mainwindow.h"
2
//#include <QApplication>
3

4
#include <iostream>
5
#include <vector>
6

7
#include <qwt_plot_curve.h>
8
#include <qwt_plot.h>
9
#include <qapplication.h>
10

11
#include <Eigen/Dense>
12

13
using Eigen::MatrixXd;
14
using Eigen::VectorXd;
15
using Eigen::Vector3f;
16
using namespace std;
17

18
int main(int argc, char *argv[])
19
{
20
    QApplication a(argc, argv);
21

22
    double x[101];
23
    double y[101];
24

25
    for ( int i = 0; i < 101; i++ ) {
26
        x[i] =  i / 10.0;
27
        y[i] = sin(x[i]);
28
    }
29

30
    QwtPlot plot;
31
    QwtPlotCurve *curve = new QwtPlotCurve();
32
    curve->setRawSamples(x, y, 101);
33
    curve->attach(&plot);
34
    plot.show();
35

36
    return a.exec();
37
}*/


so soll es
1
int main(int argc, char *argv[])
2
{
3
    QApplication a(argc, argv);
4

5
    double x[101];
6
    double y[101];
7

8
    VectorXd rowX;
9
    VectorXd rowY;
10
    rowX.setLinSpaced(100, 0 , 10);
11
    rowY.setLinSpaced(100, 0 , 100);
12
    rowY = rowX.array().sin() ;
13

14
    std::cout << rowX << std::endl;
15
    std::cout << rowY << std::endl;
16

17

18
    //x = rowX.Map(1,100);
19
    //y = rowY.Map(1,100);
20

21
    QwtPlot plot;
22
    QwtPlotCurve *curve = new QwtPlotCurve();
23
    curve->setRawSamples(rowX, rowY, 101);
24
    curve->attach(&plot);
25
    plot.show();
26

27
    return a.exec();
28
}

Kennt jemand eine Lösung?
#3694586
Lesenswert?

Ich fürchte mit einem simplen Umcasten wirst du da nicht weiter kommen.

Ein VectorXd ist laut Doku erst mal nichts anderes als eine Sonderform 
einer allgemeinen Matrix.
Für eine Matrix gibt es die Member-Funktion .data() welche dir einen 
Pointer auf die internen Daten liefert. Wie diese internen Daten 
allerdings organisiert sind, und ob dir das weiterhilft, kann ich nicht 
sagen. Im schlimmsten Fall wirst du eben eine Kopie der Daten machen 
müssen, in dem du mit dem Subscript-Operator auf die einzelnen Werte des 
Vektor in einer Schleife zugreift und im Prinzip ein Duplikat der Daten 
in deinen lokalen Arrays machst.
Ich denke aber, dass man mit .data weiterkommt. Zumnindest kligt es 
danach, als ob dort ein möglicher Ansatzpunkt zur Lösung des Problems 
liegt.
Gast #3694777
Lesenswert?

ok danke, dann bleibt mir wohl erstmal nichrts anderes übrig wie alles 
umzukopieren:
1
int main(int argc, char *argv[])
2
{
3
    QApplication a(argc, argv);
4

5
    double x[101];
6
    double y[101];
7

8
    VectorXd rowX;
9
    VectorXd rowY;
10
    rowX.setLinSpaced(100, 0 , 10);
11
    rowY.setLinSpaced(100, 0 , 100);
12
    //rowY = rowX.array().sin() ;
13
    //rowY = rowX.array().cos() ;
14
    rowY = rowX.array().tan();
15

16

17
    int i;
18
    for(i = 0; i != rowX.size(); i++) {
19
        //std::cout << row(i) << "  " << std::endl;
20
        x[i] = rowX(i);
21
        y[i] = rowY(i);
22
    }
23

24
    QwtPlot plot;
25
    QwtPlotCurve *curve = new QwtPlotCurve();
26
    curve->setRawSamples(x,y, rowX.size());
27
    curve->attach(&plot);
28
    plot.show();
29

30

31
    return a.exec();
32
}
Gast #3694811
Lesenswert?

und wenn man mag kann man den Plot noch ein wenig aufhübschen:
1
    QwtPlot plot;
2
    QwtPlotCurve *curve = new QwtPlotCurve();
3
    curve->setRawSamples(x,y, rowX.size());
4
    curve->setTitle("Sinus");
5
    curve->setPen( Qt::blue, 4 ),
6

7
    plot.setCanvasBackground(QColor(Qt::white));
8
    plot.setAxisTitle(QwtPlot::xBottom, "X-Axis");
9
    plot.setAxisTitle(QwtPlot::yLeft, "Y-Axis");
10
    plot.setAxisScale( QwtPlot::yLeft, -2, 2);
11

12

13
    curve->attach(&plot);
14
    plot.resize( 600, 400 );
15
    plot.show();

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren