Forum: PC-Programmierung Vektor aus Matrix Funktion übergeben in C#


von Alex (Gast)


Lesenswert?

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

von bla (Gast)


Lesenswert?

ü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.)

von arc (Gast)


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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#

von Alex (Gast)


Lesenswert?

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

von BILL (Gast)


Lesenswert?

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,

von Thomas (Gast)


Lesenswert?

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.

von BILL (Gast)


Lesenswert?

"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*/

von Thomas (Gast)


Lesenswert?

Und genau solchen Low-Level Krimskrams macht man in C# nicht...

von BILL (Gast)


Lesenswert?

"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 .

von Locutus (Gast)


Lesenswert?

@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

von BILL (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.