www.mikrocontroller.net

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


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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#

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: BILL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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,

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: BILL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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*/

Autor: Thomas (Gast)
Datum:

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

Autor: BILL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 .

Autor: Locutus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: BILL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar Danke,
da ist ja noch sehr c++ ähnlich bloß halt mit Klassen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.