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

Minimum aus einem bestimmten Bereich im Vektor

 

Soultan
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 03.07.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2007, 22:07     Titel: Minimum aus einem bestimmten Bereich im Vektor
  Antworten mit Zitat      
hallo together,
ich folgendes problem. i habe 2 vektoren (d und e) und möchte das minimum von d in bestimmten bereichen in denen e=1 ist ermitteln.
ich habe wie folgt angefangen, komme aber irgendwie nicht weiter:

d=[10 10 10 10 7 7 8 3 10 10 10 2 5 3 4 10 10 10 10 9 6 4 4 9 10 10 10];

e=[0 0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0];

g=find(e==1); %g=[6,7,8,11,12,13,14,15,21,22,23,24]

i=1;

for j=1:12
if g(i+j)==g(i)+j
h=g(i:i+j)
m=min(d(h));
end

i=i+length(h)-1; %schiebe i soviele stellen weiter und beginne neu

end

mit hilfe von "g" versuche i rauszufinden wieviele 1er in "e" hintereinander liegen, und bilde dann das minimun aus dem jeweiligen bereich aus "d". am schluss sollte oben als ergebnis rauskommen m=[3 2 4].
ich weiss es geht auch einfacher,....vielleicht habt ihr da ne bessere idee!?

danke
Rolling Eyes
Soultan
Private Nachricht senden Benutzer-Profile anzeigen


Michaela
Forum-Century

Forum-Century


Beiträge: 239
Anmeldedatum: 12.07.07
Wohnort: ---
Version: bis 2007b
     Beitrag Verfasst am: 24.07.2007, 23:29     Titel:
  Antworten mit Zitat      
Abend,
bin mir nicht sicher ob ich dich richtig verstanden habe. Da ich daheim kein matlab habe, hier mal ein bisschen code "ohne gewähr".

[g,index_g] = find(e ==1)

Sind e und d gleichlang? dann kannst Du ja folgendes machen

[wert,index] = min(d(g));

wert müsste jetzt eigentlich den minimalen Wert in d enthalten an den Stellen an denen e == 1.

Um den Index jetzt noch auf den ursprünglichen Index zumzumappen, musst Du noch folgendes tun:


real_index = index_g(index);


Oder habe ich Dich falsch verstanden und Du magst für jeden _zusammenhängenden_ Bereich mit e=1 das Minimum ermitteln?
Private Nachricht senden Benutzer-Profile anzeigen
 
Soultan
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 03.07.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2007, 08:54     Titel:
  Antworten mit Zitat      
Moin,

genau "e" und "d" sind gleichlang. gesucht ist das Minimum aus den bereichen von "d" wo e=1 ist. also solange e=1 soll es aus d den jeweiligen bereich rausnehmen und das Min finden. das erste Min. wäre also im bereich [7 8 3] also min=3.


Greetz
Private Nachricht senden Benutzer-Profile anzeigen
 
Michaela
Forum-Century

Forum-Century


Beiträge: 239
Anmeldedatum: 12.07.07
Wohnort: ---
Version: bis 2007b
     Beitrag Verfasst am: 25.07.2007, 19:25     Titel:
  Antworten mit Zitat      
Gibt es denn in e nur die Werte 0 und 1? Dann kommst du vielleicht mit
find(diff(e) ~=0) weiter, denn das gibt Dir die "Sprungstellen". Und dann jeweils vom aufwärts (+1) zum abwärts (-1) die Sprungstellen nehmen und darin das Minimum suchen? ICh denke, ich würde es so umsetzen. Aber um eine irgendwie geartete Schleife wirst du nicht drumrumkommen...
Private Nachricht senden Benutzer-Profile anzeigen
 
Littleman
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 26.07.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2007, 13:07     Titel:
  Antworten mit Zitat      
... wie michaela schon ausführte...

d = [10 10 10 10 7 7 8 3 10 10 10 2 5 3 4 10 10 10 10 9 6 4 4 9 10 10 10];
e = [0 0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0];

%grenzen abstecken
a = abs(diff(e));
b = find(a==1);

%untere und obere grenzen
ll = b(1:2:end)+1;
ul = b(2:2:end);

%speicher vorher allokieren!! (wenn zunehmend vergrössert wird)
mins = zeros(1,length(ll));

%minima in den bereichen finden
for i=1:length(ll),
mins(i) = min(d(ll(i):ul(i)));
end

%ausgabe
disp(mins);

versuche IMMER mit möglichst wenig schleifen zu arbeiten! MATLAB arbeitet array/vektorbasiert!
Private Nachricht senden Benutzer-Profile anzeigen
 
Soultan
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 03.07.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2007, 17:23     Titel:
  Antworten mit Zitat      
Hallö,

Hab jetzt auch schon ne Lösung gefunden; aber eine variante mit verschachtelten schleifen Smile falls jem. interessiert kann ichs gerne posten!

Danke euch für eure hilfe!
Cool
Private Nachricht senden Benutzer-Profile anzeigen
 
Michaela
Forum-Century

Forum-Century


Beiträge: 239
Anmeldedatum: 12.07.07
Wohnort: ---
Version: bis 2007b
     Beitrag Verfasst am: 26.07.2007, 20:13     Titel:
  Antworten mit Zitat      
@littleman: genauso hätt ich's auch umgesetzt - gut, wer daheim ein matlab hat...

@soultan: ja, poste doch mal deine lösung!
Private Nachricht senden Benutzer-Profile anzeigen
 
Diddy
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 02.08.07
Wohnort: ---
Version: 2009a
     Beitrag Verfasst am: 02.08.2007, 16:01     Titel:
  Antworten mit Zitat      
Hallo,

mal was prinzipielles: Benutze nie i oder j als Laufvariable, die Zählt Matlab gern als komplexe Zahlen. Nimm stattdessen andere Buchstaben oder ii und jj.

Gruß,
Christian
Private Nachricht senden Benutzer-Profile anzeigen
 
Littleman
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 26.07.07
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2007, 18:01     Titel:
  Antworten mit Zitat      
@ Diddy

Prinzipiell gebe ich dir ja recht, aber mittlerweile (neuere Matlab Versionen (R200X)) erkennt der JIT (Just-in-Time) Compiler diese Problematik und wählt den entsprechenden Datentyp aus. Kannst ja mal Performance-Messungen machen ...

Den JIT schaltest du mittels "feature accel on/off" ein/aus.

Tipp: Du hast ja Matlab R14 SP3. Lass mal ein(e) for-Schleifen-aufwendige(s) Skript/Funktion (>10000 Iterationen) laufen, öffne die Datei, schreibe NUR ein Kommentar rein, speichere ab, und lass erneut laufen ... interessante Ergebnisse (1. Lauf: 360 sek, zweiter: 17 Sek). Und genau dass ist der JIT ...
Bei Matlab 200X sind die Unterschiede nicht mehr so groß, bzw. kaum spürbar (alles so um 25 sek.). Da haben Sie das mit dem JIT wohl besser implementiert (das es immer 25 sek ist ...)

So, noch mal sowas nebenbei, hatte kürzlich diese Probleme bei Speedup-Messungen!

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