Hallo, ich habe ein Array double[,] foo = new double[5,100]; Dazu gibt es eine Funktion, die Vektoren übergeben bekommt: void foobar(ref double[] bar) { ... } Wie kann ich dieser Funktion nun eine Spalte meiner Matrix übergeben, ohne die einzelnen Elemente zuvor in eine separates eindimensionales Array kopieren zu müssen? In Matlab geht so etwas ohne Probleme, da muss es doch in C# auch einen Trick geben?! Alex
übergib einen Pointer auf das erste Element. Da die Elemente der Matrix hintereinander im Speicher liegen kannst du die restlichen Elemente mit Pointerarithmetik errechnen(je nach dem was bei dir die Spalte ist.)
Jagged Arrays: Statt double[,] double[][], dann funktioniert auch foobar(foo[n]). Allerdings muss dann nach new double[n][], die "zweite Hälfte" erst erzeugt werden.
Hoi, hätte ich auch vorgeschlagen, ist aber nicht so schön. Keine Ahnung wie es sonst geht. @bla: Pointer sind nicht so in in C#
Danke für den Tipp, werde es mal so versuchen. Das mit Pointern klappt nicht, weil in C# (oder vielmehr .NET) die Daten nicht zwingend nacheinander abgelegt werden. Alex
Ja warum auch C# Es bleibt aber nicht anderes übrig als die Werte mit einer Schleife einzeln zu übergeben. Das die erste Spalte nur Pointer auf den allocierten Memmory enthält (ist zumindest in c++ so in C# wird es nicht anders sein) Die andere Möglichkeit ist ein einzeilige Matrix ,die man wie zweizeilige behandelt: z.B. Matrix=new double [10X10] macht man Matrix[2*10+5] //3 Spalte und 5 Wert, analog Matrix[2][5] Matrix[0*10+5] //1 Spalte und 5 Wert, Matrix[1*10+5] //2 Spalte und 5 Wert,
Na dann doch lieber jagged arrays. Was nützt ihm ein eindimensionales Array, er braucht einzelne Zeilen bzw. Spalten. Die müsste er sich aus so einem flachen Array auch wieder rauspuzzeln, Sinn = 0 Auf die Interna (welcher Pointer wo hinzeigt) greift man bei C# eben nicht zurück. Das ist ja der Trick.
"Na dann doch lieber jagged arrays. Was nützt ihm ein eindimensionales Array, er braucht einzelne Zeilen bzw. Spalten. Die müsste er sich aus so einem flachen Array auch wieder rauspuzzeln, Sinn = 0 mit memcpy vieleicht??? memcpy(Target,&Matrix[2*10],10*sizeof(double));/*dritte Spalte nach Target*/
Und genau solchen Low-Level Krimskrams macht man in C# nicht...
"Und genau solchen Low-Level Krimskrams macht man in C# nicht..." Wie würde man denn z.B. in C# einen Array-Abschnitt kopieren? Ich habe noch nicht mit C# beschäftigt und versuche auch bei C++ zu bleiben so lange wie es geht. Aber interessehalber würde es mich schon interessieren .
@BILL In C# ist ja selbst ein Array eine Klasse und da geht das kopieren so: Array.Copy(sourceArray,sourceIndex,destinationArray,destinationIndex,len gth) Gibst dein Quellarray an, dann von welchem Index er anfangen soll, dann dein Zielarray, dann den Index im Zielarray und dann noch wie viele Elemente. @Alex hier mal ein Beispiel wie das mit den Jagged Arrays funktioniert und dein Problem lösen könnte. double[][] foo; int x = 4; int y = 100; foo = new double[x][]; //Erstellen der ersten Dimenstion for (int i = 0 ; i < x ; i++) { foo[i] = new double[y]; //Erstellen der Zweiten Dimension } foo[2][0] = 30; //Einfach nur ein paar Werte zum Testen foo[2][1] = 12; foo[2][2] = 1982; foobar(ref foo[2]); //Aufruf deiner foobar Funktion
Alles klar Danke, da ist ja noch sehr c++ ähnlich bloß halt mit Klassen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.