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

Schnellere Alternative zu vertcat oder A = [A;B]

 

Ltd. Dan
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 12.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2009, 19:48     Titel: Schnellere Alternative zu vertcat oder A = [A;B]
  Antworten mit Zitat      
Hallo,

folgendes Problem. Ich möchte aus einer Matrix A mit Nx1 Elementen Bestimmte Werte Auslesen und diese wieder in eine Matrix B mit Mx1 schreiben.

A = [a,b,c,d,e,f,g,h,i]

Das Problem ist das ich nur einzelne Werte NICHT lesen möchte (z.B. a und h), die Abstände dazwischen sind aber unterschiedlich und als gesonderte Information vorhanden. Ich habe eine Methode mit der es geht, allerdings dauert es ~26 Sekunden. Es handelt sich um 2.035.061 Uint16 Werte.

Code:

Current = tmp( 2 : PxPos(2) );
for i = 2:Elements(2)-1
   Current = [ Current ; tmp( PxPos(i)+1 : PxPos(i+1))];
end
 


P.S.: Mit vertcat anstatt A=[A;B] dauert es fast genauso lange.

Hoffe jemand hat eine Idee, erwarte keine fertige Lösung.

Danke
Daniel
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.11.2009, 20:25     Titel:
  Antworten mit Zitat      
Hallo,

dazu bräuchte man weitere Informationen... insbesondere:
was steht in Px?
was in Elements?

Ich habe mal versucht, das auszutesten, aber das scheint im wesentlichen nur am Ende was abzuschneiden?

Code:
%% Testdaten
tmp = rand(100,1);
PxPos = unique(randi(100, 10, 1));
%% Versuch
Current = tmp( 2 : PxPos(2) );
for i = 2:length(PxPos)-1
   Current = [ Current ; tmp( PxPos(i)+1 : PxPos(i+1))];
end


Zitat:
als gesonderte Information

vermutlich in PxPos... aber wie ist PxPos zu interpretieren?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Ltd. Dan
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 12.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2009, 11:11     Titel:
  Antworten mit Zitat      
Hallo,

Entschuldigung für den unverständlichen Code.
In Elements steht tatsächlich die Länge von PxPos.
PxPos ist ein Array in dem die Startpositionen der einzelnen Informationen stehen. Also beinhaltet Elements die Gesamtzahl der Informationen die ausgelesen werden sollen. Bei den Informationen handelt es sich um Messwerte die durch Kennungsbytes getrennt sind. Genau diese Kennungsbytes sollen aus dem Array gelöscht werden. Es Soll ein Array mit reinen Messwerten entstehen.

Code:

Elements = size(PxPos);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 18.11.2009, 11:41     Titel:
  Antworten mit Zitat      
Hallo,

wenn Du nur einzelne Werte nicht haben möchtest, warum machst Du dann nicht genau das?
Code:

% nimm alle
Current = tmp;
% und wirf die raus, die Du nicht haben willst ...
Current(PxPos) = [];
 


Wink

Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
Ltd. Dan
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 12.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2009, 12:14     Titel:
  Antworten mit Zitat      
Hallo,

Vielen Dank für den Vorschlag. Mit dem Löschen hatte ich es auch schon versucht, allerdings in einer For-Schleife. Also Achtung! Hier kommt nochmal mein NEGATIV Beispiel:
Code:

for i = 1:Elements(2)
    Current(PxPos(i)) = [];  
end
 

Elapsed time is 119.422000 seconds.

Der Aufruf von Titus liefert das selbe Ergebnis, allerdings deutlich schneller.
Code:

Current(PxPos) = [];
 

Elapsed time is 0.172000 seconds.

Das ist sehr akzeptabel. Kann mir einer von den Profis, noch kurz erklären, weshalb die Laufzeit so dramatisch abweicht. Was tut MatLab intern bei dem Aufruf Current(PxPos) = [];

Danke für gute Hilfe
Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 18.11.2009, 18:14     Titel:
  Antworten mit Zitat      
Hallo,

generell: MATLAB ist (mittlerweile) auch bei Schleifen schnell. Ausnahme: wenn sich die Größe eines Vektors in jedem Schleifendurchlauf ändert. Warum? Grob gesprochen muss MATLAB dann jedesmal einen neuen Speicherbereich suchen mit der richtigen Größe und die bisherigen Daten dorthin kopieren, und den bisherigen Bereich freigeben.
Natürlich stellt sich MATLAB nicht ganz so naiv dar, wie beschrieben, aber es beschreibt das Problem, welchem sich MATLAB gegenüber steht ...

Titus
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.