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

Vektor an best. Stellen ändern -> Doppelte Stellen !?

 

Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 26.10.2009, 17:23     Titel: Vektor an best. Stellen ändern -> Doppelte Stellen !?
  Antworten mit Zitat      
Ich steh mal wieder auf dem Schlauch...

Ich habe einen Vektor a und einen Indexvektor idx. Ich möchte alle Stellen idx von a um einen bestimmten Wert (der jeweils in b steht) erhöhen. Quasi
Code:

neu(idx)=a(idx) + b(idx);
 


nun mein Problem: Wenn in idx zwei Stellen identisch sind, wird die letzte ignoriert. Da fiel mir nur noch
Code:

for k=1:length(idx)
    neu(i)=a(i) + b(i);
end
 

ein. Wie zu erwarten, ist das irrsinnig langsam.

Wie kann ich dieses eigentlich einfach anmutende Problem lösen?
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.10.2009, 18:25     Titel:
  Antworten mit Zitat      
Lösung aber ich auch (noch) keine, nur die Idee, dass man da mit UNIQUE vorgehen könnte. Eigentlich bebnötigt man ja das genaue Gegenteil.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.10.2009, 19:31     Titel:
  Antworten mit Zitat      
Hallo,

Grobvorschlag:
- idx mit sort sortieren (sort ist schneller als unique)
- die Stellen suchen, an denen diff(idx) 0 ist (das sind die mehrfachen Indizes).
- diese Stellen rausschmeissen und die entsprechenden Inkremente aufaddieren

Grüße,
Harald
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: 26.10.2009, 23:14     Titel:
  Antworten mit Zitat      
okay, das ist schon mal ein Ansatz...

Nur wie soll ich die, die ich rauswerfe aufsummieren ? Das wäre ja eine Summe von Elementen aus b... Rolling Eyes

Code:


idx=sort(1+round( 99*rand(100000,1) ));
b=rand(1000);
neu=zeros(1000,1);

disp('for')
tic
for i=1:length(idx)
    neu(idx(i))=neu(idx(i)) + b(idx(i));
end
toc

disp('diff I')
testidx=idx;
tic;
while ~isempty(testidx)
    out=boolean( [0; diff(testidx)==0] );
    idxuse=testidx(~out);
    neudiff(idxuse)=neu(idxuse)+b(idxuse);
    testidx(~out)=[];
end
toc;

% obiges dauert recht lange, u.a. wegen dem rauslöschen
disp('diff II')
tic;
while sum(idx)~=1234567 * length(idx)
    use_this_time=[1; diff(idx)~=0] & idx~=1234567;
    idxuse=idx(use_this_time);
    neu(idxuse)=neu(idxuse)+b(idxuse);
    idx(use_this_time)=1234567;
end
toc;


liefert z.B.
Code:

for
Elapsed time is 0.030156 seconds.
diff I
Elapsed time is 1.048597 seconds.
diff II
Elapsed time is 2.862957 seconds.
 


diff II versagt in der log. Verknüpfung, lt. Profiler...
ich könnt heulen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.10.2009, 21:33     Titel:
  Antworten mit Zitat      
Hallo,

ich müsste mir das mal genauer und in Ruhe ansehen, aber erstmal folgende Hinweise:

b = rand(1000) ist eine quadratische Matrix, b(idx(i)) indiziert da dann linear rein. Ist das wirklich, was du willst? Mein Eindruck ist auch, dass da eher b(i) stehen sollte. Mal davon abgesehen, dass man i als Schleifenindex vermeiden sollte, da das eigtl die imag. Einheit ist.

Statt idxuse=testidx(~out); könnte man doch gleich im Schritt vorher auf Ungleichheit testen?

Und: es sieht hier erstmal so aus, als ob die for-Schleife das schnellste wäre. 0,03 s sind doch nicht sooo langsam?

Grüße,
Harald
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: 27.10.2009, 23:15     Titel:
  Antworten mit Zitat      
Stimmt, da hätte rand(1000,1) gemusst...
Aber das mit b(idx(i)) stimmt so. Ist ein etwas kompliziertes Ding, aber ich brauch das wirklich so... [edit] Im Grunde ist es neu(idx)=a(idx) + b(idx); - nur so, dass ich idx vom ersten zum letzten Element per Hand durchgehe...[/edit]

Zum Negieren: Das war nur aus dem Ansatz "die Stellen suchen, an denen diff(idx) 0 ist" entstanden... Beim letzten hab ichs gleich mit =~ gemacht.

Zu den Testdaten: Die entsprechen nicht so ganz dem Orginal. Ich komme vorr. erst Anfang nächster Woche zum Testen am Zielrechner, hab mir für meinen Laptop nur irgendwas gebastelt.
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.