vector<vector<float>> als float * übergeben



  • dot schrieb:

    blublub schrieb:

    Ist dies überhaupt möglich?

    Nein, denn wenn deine Funktion einen float* erwartet, dann erwartet sie wohl einen zusammenhängenden Speicherbereicht. Ein vector<vector<T>> ist nicht zusammenhängend...

    Danke.



  • sicher, dass du mit den Dimensionen nicht durcheinandergekommen bist? Ein float* entspricht einem vector<float>, also eindimensional. Ein vector<vector<float>> dagegen ist zweidimensional, also float**



  • daddy_felix schrieb:

    sicher, dass du mit den Dimensionen nicht durcheinandergekommen bist? Ein float* entspricht einem vector<float>, also eindimensional. Ein vector<vector<float>> dagegen ist zweidimensional, also float**

    Der float * sollte folgende Struktur haben:

    arr[0] = x1
    arr[1] = x2
    arr[2] = x3
    arr[3] = y1
    ...
    

    Ich verwende dafür einen 2d vector.



  • Korrektur:

    arr[3] = [b]y2[/b]
    


  • blublub schrieb:

    Ich verwende dafür einen 2d vector.

    Du verwendest einen vector aus vectoren, das ist, wenn auch zweidimensional, etwas fundamental anderes als ein zweidimensionales Array. 😉

    Was genau willst du denn machen?



  • dot schrieb:

    blublub schrieb:

    Ist dies überhaupt möglich?

    Nein, denn wenn deine Funktion einen float* erwartet, dann erwartet sie wohl einen zusammenhängenden Speicherbereicht. Ein vector<vector<T>> ist nicht zusammenhängend...

    `

    vector<T>` ist aber linear zusammenhängend. (23.2.3 Sequence containers)

    A sequence container organizes a finite set of objects, all of the same type, into a strictly linear arrangement.

    Demnach ist

    void fkt(float* p)
    {
    	for(unsigned i=0; i<10; ++i)
    		cout << p[i];
    	cout << endl;
    }
    
    int main()
    {
    	vector< vector<float> > v;
    
    	vector<float> f1(10,1);
    	vector<float> f2(10,2);
    
    	v.push_back(f1);
    	v.push_back(f2);
    
    	fkt( &v[0][0] );
    	fkt( &v[1][0] );
    
    }
    

    absolut in Ordnung.



  • dot schrieb:

    blublub schrieb:

    Ich verwende dafür einen 2d vector.

    Du verwendest einen vector aus vectoren, das ist, wenn auch zweidimensional, etwas fundamental anderes als ein zweidimensionales Array. 😉

    Was genau willst du denn machen?

    Ich nutze eine Computer Vision Bibliothek um mir Eigenvektoren zu berechnen und diese erwartet float *. Die Größe des vector 's steht auch nicht von vornherein fest, so dass ich nicht auf array umsteigen möchte.



  • out schrieb:

    vector<T> ist aber linear zusammenhängend. (23.2.3 Sequence containers)

    Natürlich, vector<T> enthält einen Zeiger auf einen zusammenhängenden Speicherbereich. Ergo ist vector<vector<T>> ein Objekt, welches einen Zeiger auf einen zusammenhängenden Speicherbereich enthält, welcher Objekte enthält, die Zeiger auf zusammenhängende Speicherbereiche enthalten, welche Objekte vom Typ T enthalten.
    Ja, wenn du nur einen Zeiger auf einen dieser Speicherbereiche haben willst, dann ist &vector[i][0] bzw. einfach vector[i].data() ok. Aber einen Zeiger auf das ganze 2D Gebilde linearisiert bekommst du nicht hin. Und da er von 2d geredet hat, ging ich natürlich davon aus, dass sein vector<vector<T>> eine Matrix darstellen soll und nicht einfach nur ein Array aus Vektoren...

    blublub2 schrieb:

    Ich nutze eine Computer Vision Bibliothek um mir Eigenvektoren zu berechnen und diese erwartet float *. Die Größe des vector 's steht auch nicht von vornherein fest, so dass ich nicht auf array umsteigen möchte.

    Und auf was soll dieser float* genau zeigen? Eine Matrix? Wenn ja: In welchem Speicherlayout?



  • dot schrieb:

    Und auf was soll dieser float* genau zeigen? Eine Matrix? Wenn ja: In welchem Speicherlayout?

    Er zeigt auf eine Koordinatenliste

    xyz[0] = x1;
    xyz[1] = y1;
    xyz[2] = z1;
    
    xyz[3] = x2;
    xyz[4] = y2;
    ...
    

    im moment verwende ich:

    while( irgendwas )
      pointCloud.push_back( x );
      pointCloud.push_back( y );
      pointCloud.push_back( z );
    end
    

    Halte es aber nicht besonders bequem zu debuggen.



  • Wieso muss der vector dann "2d" sein, wenn es einfach nur eine Liste aus Koordinaten ist? Wenn du Eigenwerte berechnen willst, brauchst du doch eine Matrix als Input!?



  • dot schrieb:

    Wieso muss der vector dann "2d" sein, wenn es einfach nur eine Liste aus Koordinaten ist? Wenn du Eigenwerte berechnen willst, brauchst du doch eine Matrix als Input!?

    War mir bequemer im debug modus. Zusammenhängende listen lesen sich nicht so einfach.



  • Naja, verwend ein entsprechendes 2D Array oder einen normalen vector<float> ...



  • blublub schrieb:

    War mir bequemer im debug modus. Zusammenhängende listen lesen sich nicht so einfach.

    Software wird normalerweise nicht fuer Bequemlichkeit im Debugmodus geschrieben.



  • knivil schrieb:

    blublub schrieb:

    War mir bequemer im debug modus. Zusammenhängende listen lesen sich nicht so einfach.

    Software wird normalerweise nicht fuer Bequemlichkeit im Debugmodus geschrieben.

    Das nicht. Allerdings sollte man diesen Aspekt auch nicht völlig vernachlässigen.


Anmelden zum Antworten