WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Kann man aus einer m-file eine mex32-Komplilat erzeugen?

 

Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 24.06.2009, 16:07     Titel: Kann man aus einer m-file eine mex32-Komplilat erzeugen?
  Antworten mit Zitat      
Hallo,

ich hab das Problem, dass mein Programm durch die Nutzung von while-Schleifen recht stark verlangsamt wird (lt. profile viewer), ich hab mir gedacht, dass durch Kompilieren evtl. ein Geschwindigkeitsvorteil entsteht.

Zuerst hab ich eine Funktion zur exe gemacht. Komplilieren klappt, nur leider habe ich es nicht geschafft, diese exe-Funktion Werte zu übergeben...

Jetzt dachte ich mir, da mcc c-Files hinterlassen hat, wird das wohl mex-mässiger Code sein (also, ich hab davon keinen Plan), welche sich aber mit "mex -g hitsorted_main.c" nicht zu einer mex32-Funktion komplilieren lassen.

Geht sowas gar nicht ? muss ich meine Funktion nach C/mex portieren ?
Bringt das überhaupt was ?
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 24.06.2009, 16:41     Titel:
  Antworten mit Zitat      
Ob als EXE oder Library (mit dem MATLAB Compiler erstellt) - der M-code nutzt die MATLAB Component Runtime Umgebung und ist damit normalerweise genauso schnell oder langsam wie mit MATLAB der gleichen Hardware.

Aber es gibt natücliich jede Menge Möglichkeiten MATLAB Code zu beschleunigen. Wo ist den das Hauptproblem? Speicherverbrauch und damit verbunden swapping, oder "normale" Laufzeitprobleme. Was sagt den der MATLAB Profiler wo der Flaschenhals ist?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 24.06.2009, 23:49     Titel:
  Antworten mit Zitat      
Danke für die schnelle Antwort !
Okay, dann quäl ich mich erst mit dem Kompilieren rum, wenn's fertig ist !

Also, zeitkritisch ist mein Problem an folgender Stelle:
Ich habe zwei Listen mit Koordinaten, gleiche Koordinaten sollen ausgegeben werden.
um nicht jedes Element mit jedem zu verglichen, hab ich die Listen sortiert, hole mir die erste x-Koordinate und gehe dann die zweite Liste durch, bis zur Übereinstimmung der x-Koordiante, dann überprüfe ich alle anderen Koordinaten. Andererseits überspringe ich in der ersten Liste Vergleiche, sollte dort die (neue) x-Koordinate der zweiten nicht vorhanden sein.
Das ganze löse ich über while-Schleifen, kombiniert mit ein paar if's, um die Endbedingungen zu finden (also Listenende).

Ich hoffe das war jetzt halbwegs verständlich...
Oder gibt es dafür schon eine fertige Implementation ?


Wie gesagt, der Profiler findet den Zeitverbrauch halt in den Schleifenköpfen. Obiges Problem entstand nur durch den Kampf gegen den Speicherverbrauch Rolling Eyes
swapping tritt nicht auf.
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 25.06.2009, 08:41     Titel:
  Antworten mit Zitat      
Ich würde mal behaupten der UNIQUE Befehl macht das ganze schneller. Vielleicht kann SORT auch irgendwo nützlich sein. Bei Performance-Erfolg bitte unbedingt berichten!

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 25.06.2009, 13:46     Titel:
  Antworten mit Zitat      
unique geht ja nur bei einer Matrix, ich hab mir mal die querverweise dazu durchgelesen, und bin fündig geworden:
intersect(A,B,'rows') ist das, was ich brauche.

Grad noch gefreut, schon wieder Evil or Very Mad - die Prozedur braucht etwa 50% länger wie mein Suchalgorithmus...
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 25.06.2009, 14:16     Titel:
  Antworten mit Zitat      
Ich bin gerne bereit bei Vorlage eines Codes mit Daten zu schauen ob ich was optimieren kann. Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 25.06.2009, 15:03     Titel:
  Antworten mit Zitat      
Du hast PN Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 26.06.2009, 10:19     Titel:
  Antworten mit Zitat      
Der Code mit den Beispieldaten läuft bei mir in 8 Millisekunden durch. D.h. ich nehe an Probleme entstehen erst bei grösseren Datanmengen?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 26.06.2009, 11:28     Titel:
  Antworten mit Zitat      
Ja, die Daten waren nur ein gaanz Beispiel um die Datenstruktur zu zeigen...

Diese Berrechnung wird dann, wenn's fertig ist, ein paar Millionen Mal durchgeführt... Also, dass es lange dauert ist schon klar, es soll sich halt irgendwie in Grenzen halten...

ich hab einen Testsatz hochgeladen:
http://rapidshare.com/files/248799994/testdaten1.mat
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 26.06.2009, 13:37     Titel:
  Antworten mit Zitat      
Ich verstehe noch nicht, ob "treffer" in beiden Beispielen wirklich leer sein soll, schliesslich gibt es ja Koorinaten die doppelt auftreten. D.h der Code nach der IF Abfrage

Code:

if matter(idxm,1)==object(idxo,1) && matter(idxm,2)==object(idxo,2) && matter(idxm,3)==object(idxo,3)
 


muss verstanden werden um eine Aussage über den Gesamtcode zu erzielen. Ich kann mit vorstellen, dass bei sehr grossen Datenmengen folgender Trick eine bessere Performance erzielt als die riesige WHILE IF Schleife: Falls es einen technisch eindeutigen Höchstwert für alle Koordinaten gibt, könnten diese in eine eineindeutige Zahl umgewandelt werden. Beispiel, der Höchstewert ist 100, dann kann die eineindeutige Repräsentation durch x*100*100+y*100+z berechenet werden. Dann könnten wiederum MATLAB performance optimierte Routinen eingesetzt werden. Aber das kann dann schön viel Speicher fressen. Daher bitte 64 Bit MATLAB einsetzen.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 26.06.2009, 16:56     Titel:
  Antworten mit Zitat      
Wie meinst du Treffer muss leer sein ?
Ich hab den nur mit zeros initialisiert, um Zeit durch dynamische Vergrösserung zu sparen.
Am Ende werden dann alle Zeichen nach der i-ten gelöscht.
Ich will ja quasi die Koordinaten finden, die in beiden doppelt auftreten. (oder gibt's in den Beispieldaten auch doppelte? Confused )

Die Sache mit x*100*100 ist ne gute Idee, aber die zeitraubenden while-Schleifen nach o.g. if bleiben ja noch.

Vielleicht gehts schneller, wenn ich's dir in Echtzeit erklären kann ? - Wenn du magst, schick mir einfach deinen skype-Namen !
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 29.06.2009, 15:02     Titel:
  Antworten mit Zitat      
Do, nachdem bei grösseren Matrizen auch mein Code versagt, hab ich mir "intersect" und das darin genutzte sortrows genauer angesehen, das ist das Ergebnis:
Code:

  c = [a;b];
  c = c ( sort_back_to_front(c) , : );
 
 
  % Find matching entries in sorted rows.
  [rowsC,colsC] = size(c);
  if rowsC > 1 && colsC ~= 0
    % d indicates the location of matching entries
    d = c(1:rowsC-1,1:3) == c(2:rowsC,1:3);
  else
    d = zeros(rowsC-1,0);
  end
 
  d = find(all(d,2));
 
  c = c(d,:);         % Intersect is list of matching entries
 

 
 
function ndx = sort_back_to_front(x)
% NDX = SORT_BACK_TO_FRONT(X) sorts the rows of X by sorting each column
% from back to front.  This is the sortrows algorithm used in MATLAB 6.0
% and earlier.

[m,n] = size(x);
ndx = (1:m)';
for k = n-1:-1:1
    [ignore,ind] = sort(x(ndx,k));
    ndx = ndx(ind);
end
 


Es geht jetzt schon, schneller wär natürlich besser
(hier für 100x100x100 @ 1.5 GHz):
Code:

  0.02       1    6   c = [a;b];
  0.28       1    7   c = c ( sort_back_to_front(c) , : );
                  8  
                  9 %  c1 = [a;b];
                 10 %  c1 = soort(c);
                 11  
                 12   % Find matching entries in sorted rows.
< 0.01       1   13   [rowsC,colsC] = size(c);
             1   14   if rowsC > 1 && colsC ~= 0
                 15     % d indicates the location of matching entries
  0.03       1   16     d = c(1:rowsC-1,1:3) == c(2:rowsC,1:3);
                 17   else
                 18     d = zeros(rowsC-1,0);
                 19   end
                 20  
< 0.01       1   21   d = find(all(d,2));
                 22  
< 0.01       1   23   c = c(d,:);  
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 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.