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

Schnelle Lookup-Table

 

Pauli123

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2009, 14:59     Titel: Schnelle Lookup-Table
  Antworten mit Zitat      
Hallo Leute,

ich habe ein 'Geschwindigkeitsproblem' mit meinem Code. Ich benutzte in einer komplexen schleife mehrere interp1 - Lookuptables. Über den Profiler habe ich herausgefunden, dass diese Befehle mit abstand die meiste Zeit in Anspruch nehmen.
Nun meine Frage: Gibt es eine Leistungsfähigere Lookup-Table Funktion? oder kann man interp1 irgendwie optimieren?

Code:

for t=1:length(Last)
...
U=interp1(UI(1,:),UI(2,:),I,'linear')
...
PBZBus=interp1(PP1(1,:),PP1(2,:),PBZ,'linear')
...
PSP=interp1(PP2(1,:),PP2(2,:),PSPBus,'linear')
...
end;
 


Gruß Pauli


Pauli123

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2009, 18:09     Titel:
  Antworten mit Zitat      
Ich hab mir jetzt notgedrungen ne eigene Lookup-Table-Funktion geschrieben. Was meint ihr dazu? Ist das effizient? Oder kennt jemand noch ne schnellere Variante?

Code:

function Y=lookuptable(Tabledata,X)

% Y=lookuptable(Tabledata,X)
%
% Tabledata = 2xN Tabelle, wobei Tabledata(1,Smile die XWerte sind und Tabeldata(2,Smile die YWerte
% X ist ein Skalar

%Extrapoliert Endwerte
    if X<=Tabledata(1,1), Y=Tabledata(2,1); return; end;
    if X>=Tabledata(1,end), Y=Tabledata(2,end); return; end;

%Suchen der richtigen Stelle mittels größer / kleiner und summieren der Einsen
    a=sum(Tabledata(1,:)<X);
    b=size(Tabledata,2)-sum(Tabledata(1,:)>X)+1;
    if b-a==2,
        Y=Tabledata(2,a+1); % trifft genau -> keine interpolation
    else
        %Interpolation wenn nicht genau getroffen
        y1=Tabledata(2,a);
        y2=Tabledata(2,b);
        x1=Tabledata(1,a);
        x2=Tabledata(2,b);
        Y=y1+((y2-y1)/(x2-x1))*(X-x1);
    end;
 

mit deisem Code statt der interp1 war mein Code gut 10mal schneller. Aber ich wäre für weiter Verbesserungsvorschläge sehr dankbar. Very Happy
 
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.