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

Punkte in Matrix finden

 

rooky
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 76
Anmeldedatum: 25.04.12
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 28.01.2014, 05:24     Titel: Punkte in Matrix finden
  Antworten mit Zitat      
Hallo alle miteinander,
ich komm gerade mit einem Punkt nicht weiter:
ich habe eine Matrix
Code:
a=[1 3 4 5 6;5 6 3 5 4;4 6 7 4 9];

a schaut so aus, kann man leichter lesen:
Code:
     1     3     4     5     6
     5     6     3     5     4
     4     6     7     4     9

und einen Vector:
Code:
b=[1 2 1 3 3];

b hat genausoviele Werte wie a Spalten. Jetzt suche ich genau die Werte in a die b vorgibt. Als Ergebnis sollte stehen:
Code:
[1 6 4 4 9]


Also der jeweilige Wert in der Spalte.

Kann mir da jemand helfen?
Danke
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.01.2014, 10:51     Titel:
  Antworten mit Zitat      
Code:
c=a(b+[0:size(a,1):(size(a,2)-1)*size(a,1)]);

das währe jetzt erstmal meine lösung. alternativ geht natürlich auch eine simple for schleife.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
rooky
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 76
Anmeldedatum: 25.04.12
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 28.01.2014, 16:36     Titel:
  Antworten mit Zitat      
Vielen Dank,
das mit der Schleife wuerde ich auch koennen.
Deinen Vorschlag probier ich jetzt mal aus
Es ist nur die Frage was ist schneller, die Schleife oder dein Vorschlag

Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.01.2014, 16:57     Titel:
  Antworten mit Zitat      
du hast die frage heute morgen um 4 gestellt es ist jetzt 16 uhr. das der code 12 stunden wieder rausholt ist fraglich.
aber scherz bei seite. sowas ist immer wichtig. nutzen und aufwand. forschleifen sind nicht unbedingt langsam. matlab macht da intern einige optimierungen. wenn der speicher vorher reserviert ist gehen die meisten sachen mit for schleifen recht fix. wenn du also 2 h damit verbringst code zu optimieren um 1 sek laufzeit zu erhalten ist das nur sinnvoll wenn große datenmengen verarbeitet werden und es auf diese sek auch ankommt ^^
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
rooky
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 76
Anmeldedatum: 25.04.12
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 28.01.2014, 17:42     Titel:
  Antworten mit Zitat      
kurz zur Zeit.
Ich hab die Frage Nachts um glaub ich 23.00Uhr gestellt, dann bin ich ins Bett gegangen. Bei euch war es da 4.00Uhr, kann sein. Ich mag euer Forum, weil die Antworten besser sind als in meinem Land. Sorry.
Die Zeit ist bei mir ganz wichtig!! Nicht meine Arbeitszeit, sondern die Rechenzeit.
Wie muesste ich denn den Code aendern wenn meine Matrix 10 x 380 und der Vector 1 x 380 waere? (Ich hab leider auch keine Umlaute)

Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.01.2014, 17:50     Titel:
  Antworten mit Zitat      
rooky hat Folgendes geschrieben:

Wie muesste ich denn den Code aendern wenn meine Matrix 10 x 380 und der Vector 1 x 380 waere? (Ich hab leider auch keine Umlaute)

Danke

was funktioniert denn an meiner lösung nicht bei der größeren matrix?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
rooky
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 76
Anmeldedatum: 25.04.12
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 28.01.2014, 18:03     Titel:
  Antworten mit Zitat      
passt alles. Danke. War mein Fehler
Hier zur Info:
mit Schleife:
Elapsed time is 0.000009 seconds.

dein code:
Elapsed time is 0.000020 seconds.

ich glaub dann bleib ich bei der Schleife.

Und nochmals vielen Dank und einen schoenen Abend (oder halt guten Morgen) Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.01.2014, 18:19     Titel:
  Antworten mit Zitat      
nochmal ne nachfrage. wie siht denn deine schleifenlösung aus?
meine schleife ist weitaus langsamer als meine ursprüngliche version
bsp:
Code:

a=rand(1000,100000);
b=randi(1000,1,100000);
tic
c=a(b+[0:size(a,1):(size(a,2)-1)*size(a,1)]);
toc
tic
d=nan(size(b));
for k=1:size(b,2)
    d(k)=a(b(k),k);
end
toc
 

ergebniss:
Code:
Elapsed time is 0.003821 seconds.
Elapsed time is 0.086627 seconds.

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
rooky
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 76
Anmeldedatum: 25.04.12
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 28.01.2014, 23:38     Titel:
  Antworten mit Zitat      
Richtigstellung:
Das ist hier die (mir bekannte) schnellste Loesung
Code:
c=a(b+[0:size(a,1):(size(a,2)-1)*size(a,1)]);


Auch wenn ich
Code:

schon definiert ist, ist die Schleife langsamer.

Scheinbar war mein Rechner bei meinem Testlauf mit irgnedwas beschaeftigt, was mein Ergebnis verfaelscht hat.

Ich habs ja gesagt: Die Antworten hier sind nachhaltiger

Danke
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: 29.01.2014, 12:51     Titel: Re: Punkte in Matrix finden
  Antworten mit Zitat      
Hallo rooky,

Winkows Lösung lässt sich noch marginal beschleunigen:
Code:
c=a(b:size(a,1):b+(size(a,2)-1)*size(a,1));

Denn so spart man sich eine Addition von b mit einem Vektor. Ich bezweifele aber, dass dies die Laufzeit merklich verkürzt.

Für solche Indizierungsprobleme sind auch SUB2IND und IND2SUB hilfreich. Intern machen sie aber genau das, was in Winkow's Vorschlag auch gemacht wird.

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.