|
|
Minimum aus einem bestimmten Bereich im Vektor |
|
Soultan |
Forum-Newbie
|
|
Beiträge: 6
|
|
|
|
Anmeldedatum: 03.07.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.07.2007, 21:07
Titel: Minimum aus einem bestimmten Bereich im Vektor
|
|
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
Soultan
|
|
|
|
|
Michaela |
Forum-Century
|
|
Beiträge: 239
|
|
|
|
Anmeldedatum: 12.07.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: bis 2007b
|
|
|
|
|
|
Verfasst am: 24.07.2007, 22:29
Titel:
|
|
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?
|
|
|
Soultan |
Themenstarter
Forum-Newbie
|
|
Beiträge: 6
|
|
|
|
Anmeldedatum: 03.07.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 25.07.2007, 07:54
Titel:
|
|
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
|
|
|
Michaela |
Forum-Century
|
|
Beiträge: 239
|
|
|
|
Anmeldedatum: 12.07.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: bis 2007b
|
|
|
|
|
|
Verfasst am: 25.07.2007, 18:25
Titel:
|
|
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...
|
|
|
Littleman |
Forum-Newbie
|
|
Beiträge: 4
|
|
|
|
Anmeldedatum: 26.07.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 26.07.2007, 12:07
Titel:
|
|
... 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!
|
|
|
Soultan |
Themenstarter
Forum-Newbie
|
|
Beiträge: 6
|
|
|
|
Anmeldedatum: 03.07.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 26.07.2007, 16:23
Titel:
|
|
Hallö,
Hab jetzt auch schon ne Lösung gefunden; aber eine variante mit verschachtelten schleifen falls jem. interessiert kann ichs gerne posten!
Danke euch für eure hilfe!
|
|
|
Michaela |
Forum-Century
|
|
Beiträge: 239
|
|
|
|
Anmeldedatum: 12.07.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: bis 2007b
|
|
|
|
|
|
Verfasst am: 26.07.2007, 19:13
Titel:
|
|
@littleman: genauso hätt ich's auch umgesetzt - gut, wer daheim ein matlab hat...
@soultan: ja, poste doch mal deine lösung!
|
|
|
Diddy |
Forum-Fortgeschrittener
|
|
Beiträge: 61
|
|
|
|
Anmeldedatum: 02.08.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 2009a
|
|
|
|
|
|
Verfasst am: 02.08.2007, 15:01
Titel:
|
|
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
|
|
|
Littleman |
Forum-Newbie
|
|
Beiträge: 4
|
|
|
|
Anmeldedatum: 26.07.07
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 02.08.2007, 17:01
Titel:
|
|
@ 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
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|