Forum: PC-Programmierung Eigen3 Vector zu Standard-Array (C++) wandeln


von Freddy (Gast)


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?

von Karl H. (kbuchegg)


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.

von Freddy (Gast)


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
}

von Freddy (Gast)


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

von Freddy (Gast)


Angehängte Dateien:

Lesenswert?

ein kleiner Screenshot

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.