Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » double pointer ~ 2d-array

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.01.2012, 16:32 Uhr
banshee



Hi,

bin gerade zu doof, ein multidimensionales array korrekt in einem double-pointer anzulegen.
Die Äquivalenz zwischen Array und Pointer verwirrt mich da jedesmal aufs neue. Da:


C++:
float* foo = new float[A];


funktioniert, dachte ich, es müsste mit einem der beiden Aufrufe gehen:


C++:
float** foo = new float[A][B];
float** foo = new float*[A][B];


fruchtet aber leider beides nicht. Wie geht es richtig oder muss ich das kompliziert in einer Schleife ineinander packen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.01.2012, 17:11 Uhr
ao

(Operator)


Entweder so:

C++:
float * foo = new float [A*B];


und dann selber errechnen, wo die Zeilen zuende sind, oder so:

C++:
float ** foo = new float * [A];
for (int i = 0; i < A; i++)
{
  foo[i] = new float [B];
}


Dieser Post wurde am 08.01.2012 um 17:11 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.01.2012, 19:05 Uhr
banshee



Ja, letzteres meinte ich, sieht halt sehr umständlich aus. Das erste geht leider nicht, weil das ein Ausgabeparameter einer OpenCV-Funktion werden soll und der const float** sein muss. Dachte man könnte da nen Einzeiler in ner ähnlichen Form wie aus deinem erstes Beispiel basteln, aber dem ist wohl offentlichtlich nicht so oder kann man dann einfach &foo übergeben?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.01.2012, 09:19 Uhr
ao

(Operator)



Zitat von banshee:
Das erste geht leider nicht, weil das ein Ausgabeparameter einer OpenCV-Funktion werden soll und der const float** sein muss.

Kannst du diese Randbedingungen genauer erklären? Vielleicht mit einem Codefragment?


Zitat:
Die Äquivalenz zwischen Array und Pointer verwirrt mich da jedesmal aufs neue.

Diese Äquivalenz ist ja auch nur scheinbar vorhanden. Das eine ist eine Aneinanderreihung mehrerer gleicher Objekte. Das andere zeigt auf eine solche Reihung oder auf ein Einzelobjekt.

Die Vorstellung, Arrays und Pointer seien "irgendwie dasselbe", ist nicht hilfreich. Man sollte sich davon verabschieden. Der Eindruck von Äquivalenz entsteht nur durch die austauschbare Syntax.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.01.2012, 09:44 Uhr
0xdeadbeef
Gott
(Operator)


const float** als Ausgabeparameter? Ernsthaft?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.01.2012, 22:26 Uhr
banshee



Hier ist die Doku: http://opencv.itseez.com/modules/ml/doc/k_nearest_neighbors.html

Es geht um CvKNearest.find_nearest()

Da übergibt man die Traininsdaten und das k für den kNN-Algorithmus und bekommt dann optionale Input-Parameter ausgefüllt.

Sieht dann so aus:

C++:
const uint k = 7;
        CvMat* results = cvCreateMat(classnum, 1, CV_32F);
        CvMat* responses = cvCreateMat(classnum, k, CV_32F);
        CvMat* dist = cvCreateMat(classnum, k, CV_32F);
        const float* neighbors = new const float[k*classnum];
        CvMat* datapoints = arr2mat(training_transformed);
        CvMat* testSamples = arr2mat(test_transformed);
        CvKNearest kNN(datapoints, trainingClasses, 0, false, k);
        kNN.find_nearest(testSamples, k, results, &neighbors, responses, dist);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.01.2012, 01:15 Uhr
0xdeadbeef
Gott
(Operator)


Ich glaube, das ist anders gemeint. Ich verstehe das etwa so:

C++:
// ...
float const **neighbors = new float const *[k * tesSamples->rows];

knn.find_nearest(testSamples, k, results, neighbors, responses, dist);


...und find_nearest schreibt dir dann Zeiger (vermutlich auf kNN-interne Daten) in das Zeigerarray, nicht floats. Dann macht auch der Datentyp Sinn.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.01.2012, 14:36 Uhr
banshee



Ja, den Fehler habe ich schon gefunden, als ein paar meiner Daten nach dem find_nearest() plötzlich 0 waren, ohne dass sie benutzt worden wären.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.01.2012, 22:17 Uhr
banshee



Gibt es eigentlich eine Möglichkeit, sich das gescheit im Debugger anzuschauen? Wenn ich da das array als Überwachung eintrage, zeigt er mir von jedem Float-Zeiger-Element logischerweise nur den ersten float.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.07.2012, 18:40 Uhr
banshee



Aus aktuellem Anlass:

Ich bekomme aus einer Bibliotheksfunktion zweidimensionale Daten als 1D-Zeigerarray zurück, will diese intern in einer Datenklasse speichern und am liebsten auch über die 2D-Indizes darauf zugreifen.

Möglichkeit #1 wäre also, wie im 2. Post vorgeschlagen, noch mal ein neues 2D-Array anzulegen und die Daten rüberzukopieren. Allerdings handelt es sich dabei um ~5 Arrays zu je 150k floats, also relativ ineffizient, alles noch mal zu kopieren, wenn es eigentlich schon da ist.

Die andere Möglichkeit ist, die Daten einfach 1:1 zu kopieren, für jedes Datum seine Dimensionen mitzuspeichern und dann bei jedem Zugriff mit den Indizes rumzurechnen, in Sachen Handhabung also weniger schön.

Geht es nicht noch besser?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: