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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.