Vektor aus Matrix Funktion übergeben in C#

Gast #386339
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
Gast #386340
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.)
Gast #386344
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,
Gast #386345
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.
Gast #386346
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*/
Gast #386348
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 .
Gast #386349
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren