vector<vector<float>> als float * übergeben
-
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 aufarrayumsteigen 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 istvector<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. einfachvector[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 seinvector<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 aufarrayumsteigen 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 ); endHalte 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.