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

SCHNELLES finden in geordneter menge

 

BigSkylie
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2012, 13:04     Titel: SCHNELLES finden in geordneter menge
  Antworten mit Zitat      
Hallo,

ich habe einen Vektor x aus einigen hundert Zufallszahlen zwischen 0 und 1 und eine Skalare Zufalllszahl randn zwischen 0 und 1. Nun möchte ich den Index der Zahl in x, die randn am nächsten ist. Bisher sieht mein Algorithmus so aus:

Code:
function ind = findinterval(x,randn)
  vTmp = x > randn;
  ind = find(vTmp, 1 );
end


Dabei ist mir völlig wurst, dass er immer die nächstgrößere Zahl findet, aber der Algorithmus ist mir zu langsam. Noch langsamer ist

Code:
function ind = findinterval(x,randn)
  [~, ind] = min(abs(x – randn))
end


Beide Codes berücksichtigen nicht, dass meine Menge geordnet ist. Meine Idee wäre jetzt eine For-Schleife, die in der Mitte von x anfängt, schaut ob randn größer oder kleiner als die Mitte ist und dann das Intervall halbiert und das gleiche noch einmal macht. In C++ wäre das sicher schneller, in Matlab wohl kaum, da der Code nicht vektorisiert ist.

Die Funktion wird oft benötigt und pro Verwendung ungefähr 1E10 mal aufgerufen, was locker mehreren Stunden entspricht. Eine Halbierung der Zeit wäre schon genial.

Gruß, BigSkylie
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.01.2012, 14:08     Titel:
  Antworten mit Zitat      
Hallo,

ich würde das an deiner Stelle mal schreiben und testen.

Was schneller sein dürfte, wäre eine Art Sekanten-Algorithmus.
Code:
http://en.wikipedia.org/wiki/Secant_method


Mit MATLAB Coder (früher Embedded MATLAB) könntest du daraus dann automatisch C-Code generieren, was nochmal ein wenig schneller sein dürfte.
Code:
doc codegen % seit 2011a
doc emlc      % vor 2011a

Falls die Doku nicht aufgerufen werden kann, hast du wohl das Produkt nicht.

Grüße,
Harald

P.S.: ich gehe davon aus, dass es immer verschiedene x sind? Ansonsten könnte man ja "lernen", wo zu suchen ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.01.2012, 18:27     Titel: Re: SCHNELLES finden in geordneter menge
  Antworten mit Zitat      
Hallo BigSkylie,

Was spräche gegen eine BinarySearch in einer C++Mex-funktion?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
BigSkylie
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2012, 19:01     Titel:
  Antworten mit Zitat      
Hallo Jan, Hallo Harald,

Vielen Dank euch beiden schonmal. Bin gerade dabei mir Visual Studio zu installieren, damit ich codegen verwenden kann. Ich hoffe mal damit komme ich zurecht, meine C++-Kentnisse sind eher dürftig.

BinarySearch scheint genau das zu sein was ich brauche. Wenn ich den Matlab Code in C++ portieren kann,dann wäre das sicher super.



Gruß, BigSkylie
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.01.2012, 21:37     Titel:
  Antworten mit Zitat      
Hallo BigSkylie,

Ich würde das direkt in C schreiben. Wenn man nur Mex-Files compilieren möchte, reicht eine Installation des SDK7.1 aus.

Ich schaue mal, ob ich eine passende Routine zusammen bekomme.

Gruß, Jan
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 - 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.