|
mark12345 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 11.08.2010, 11:31
Titel: sub2ind in C?
|
 |
Hallo,
also ich hab mal gar keine Ahnunhg von C bis jetzt, aber ich überlege mir einen kleinen Teil meines Programms zu einem mex-File in C umzuschreiben.
Es könnte aber gut daran scheitern wie ich die Funktion sub2ind aus Matlab in C umschreibe. Mal ganz allgemein wird das schwer? Wie gut kann C mit Matrizen umgehen?
Grüße Mark
|
|
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 11.08.2010, 12:19
Titel:
|
 |
Hallo Mark,
auf Anhieb kann C eigentlich gar nicht mit Matrizen umgehen. Man kann zwar mehrdimensionale Arrays in C definieren, das schafft aber oft große Verwirrung, weil Matlab die Werte splaten-orientiert schreibt, C aber zeilelorientiert.
SUB2IND ist aber recht einfach, z.B. für ein 3D Array:
Effizienter wird es aber in C, wenn Du z.B. ein Array Element für Element bearbeitest. Dann Kannst Du einfach mit einem Zeiger auf das erste Element starten und dann ber ++ Operator den Zeiger immer weiter schieben. Die benötigt intern nur eine Multiplikation (nämlich mit der Anzahl der Bytes pro Element), während "X[i][j]" 3 Multiplikationen benötigt und damit natürlich erstmal langsamer ist. Der Intel-Compiler kann dann zwar solche Konstrukte sehr gut erkennen und sich einiges an Rechenzeit ersparen. Pointer-Arithmetik ist aber im Allgemeinen schneller (und C-typisch aber acuh weniger übersichtlich).
Gruß, Jan
|
|
|
mark12345 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 11.08.2010, 12:46
Titel:
|
 |
Ok dachte das wäre das größte Problem. Aber da kennt sich ja jemand aus.
Kannst mir noch sagen wie es hierfür aussehen muss:
Rueck(sub2ind(size(Rueck),y,x))=Value(:,ind,strahl)
Ruech ist als Zero-matrix vorbelegt und ich schreib halt die Werte von Value rein.
Vielen Dank
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 11.08.2010, 14:10
Titel:
|
 |
Hallo Mark,
mark12345 hat Folgendes geschrieben: |
Rueck(sub2ind(size(Rueck),y,x))=Value(:,ind,strahl)
|
Nun scheint "Value(:, ind, strahl)" ja ein Array zu sein. Dann setzt man für "i" aus meinem letzten Beispiel halt alle Werte von 1 bis "size(Value, 1)" ein. Dies wird also in C eine Schleife sein müssen. Wie x und y zu übersetzen sind, kann ich nicht wissen, da ich weder die Werte noch die Dimensionen kenne.
Viele Erfolg beim Probieren, Jan
|
|
|
mark12345 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 11.08.2010, 14:57
Titel:
|
 |
Ok,
bin am Probieren und es wird nur noch ein Fehler gemeldet.
Kann mir jemand sagen, wie man n:irgendeinwert in C schreibt?
Danke
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 11.08.2010, 15:15
Titel:
|
 |
Hallo Mark,
Du brauchst eine FOR oder WHILE Schleife ind C. Einen Colon-Operator um Vektoren zu erzeugen gibt es nicht.
Gruß, Jan
|
|
|
mark12345 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 17.08.2010, 09:49
Titel: sub2ind in C
|
 |
|
 |
|
Hallo
ich wollte dies noch einmal aufgreifen:
Effizienter wird es aber in C, wenn Du z.B. ein Array Element für Element bearbeitest. Dann Kannst Du einfach mit einem Zeiger auf das erste Element starten und dann ber ++ Operator den Zeiger immer weiter schieben. Die benötigt intern nur eine Multiplikation (nämlich mit der Anzahl der Bytes pro Element), während "X[i][j]" 3 Multiplikationen benötigt und damit natürlich erstmal langsamer ist. Der Intel-Compiler kann dann zwar solche Konstrukte sehr gut erkennen und sich einiges an Rechenzeit ersparen. Pointer-Arithmetik ist aber im Allgemeinen schneller (und C-typisch aber acuh weniger übersichtlich).
Ich kam bis jetzt nicht dazu und sitz jetzt wieder dran. Mein erster Gedanke war es eigentlich wie an der Stelle: "während "X[i][j]" 3 Multiplikationen benötigt" umzusetzten. Da ich ja [i] und [j] habe.
Da dies aber nicht so "schnell ist muss ich doch einfach bei einer 10x10 Matrix einen linearen Index berechnen aus zuerst y (zeilenorientiert):
y=i;
x=J;
(y-1)*10 + x-1 % - 1 weil 0 erster Index
das ist dann die Größe um die der Pointer weiterwandern muss (mal Größe Datentyp), oder?
Viele Grüße Mark
|
|
|
Achi |

Forum-Guru
|
 |
Beiträge: 250
|
 |
|
 |
Anmeldedatum: 14.04.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2007a
|
 |
|
|
 |
|
Verfasst am: 14.12.2010, 12:41
Titel:
|
 |
Zitat Jan:
Hallo Mark,
auf Anhieb kann C eigentlich gar nicht mit Matrizen umgehen. Man kann zwar mehrdimensionale Arrays in C definieren, das schafft aber oft große Verwirrung, weil Matlab die Werte splaten-orientiert schreibt, C aber zeilelorientiert.
Genau das verwirrt mich gerade. Will auch überprüfen ob ich das richtug mache also sub2ind in C.
Das ist meine Lösung dazu (2D MAtrix), ich will Daten aus einem Bild auslesen.
Aber wenn das ganze in C ja nicht splatenorientiert ist müsste ich doch xArray und yArray austauschen oder? Aber das Bild müsste ja auch spaltenorientiert eingelesen worden sein und somit dreht es sich ja auch "rum" und dürfte dann doch wieder passen ODER? -> VERWIRRUNG
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|