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

supremum Matlab

 

thomas0815
Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2010, 20:34     Titel: supremum Matlab
  Antworten mit Zitat      
Hallo zusammen,

ich habe einen Spaltenvektor mit i=1:n Elementen n=100.

ich möchte jetzt das Element ausgegeben haben, was am nächsten an einen gegebenen Wert dran liegt.

Beispiel Spaltenvektor V=[1,2,5,6,7]' ; Gegebener Wert 5,7 ... die oberere Grenze (supremum) ist also 6 und die 6 ist das i=4 Element im Spaltenvektor V.

Ist das in Matlab so umsetzbar?

Danke und viele Grüße,
Thomas
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: 27.07.2010, 09:41     Titel:
  Antworten mit Zitat      
Code:

[a,b]=min(abs(V-5.7))
 


Vielleicht gibt es noch bessere Umsetzungen, habe das ist die simpelste, denke ich.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 27.07.2010, 09:56     Titel:
  Antworten mit Zitat      
Andreas Goser hat Folgendes geschrieben:
Code:

[a,b]=min(abs(V-5.7))
 


Vielleicht gibt es noch bessere Umsetzungen, habe das ist die simpelste, denke ich.

Andreas


Hallo Andreas,

ich glaube es würde zu einem fehler kommen wenn V=[1 2 5 6 5.6] wäre.
weil es wird immer die nächste zahl gesucht, und nicht die obere grenze wie Thomas gewünscht hat.

gruss
_________________

Ein schlechter General ist besser als zwei gute.
Private Nachricht senden Benutzer-Profile anzeigen
 
yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 27.07.2010, 11:10     Titel:
  Antworten mit Zitat      
Moin Fourier,

den eventuellen Fehler kann ich nicht bestätigen. Habe es eben mal ausprobiert:
Code:

v = [1 2 5 6 5.6];
[a b] = min(abs(v-5.7))
a =
    0.1000
b =
    5

v = [1 2 5 6 7];
[a b] = min(abs(v-5.7))
a =
    0.3000
b =
    4

%und logischerweise
v = [1 2 5 6 5.6 7 5.6];
[a b] = min(abs(v-5.7))
a =
    0.1000
b =
    5
 


Ciao,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 27.07.2010, 11:24     Titel:
  Antworten mit Zitat      
hallo Yankemen,

bei deinem ersten Beispiel sollte b=4 rauskommen.
weil die 6 die nächste obere schranke ist. und nicht das 5.element (5.6).

ich habs so gemacht:
Code:

v=[1 2 5 6 7];
w=5.2;
x=v-w;

a=min(x(x>0));
sprintf('die %d, das %d.te Element',a+w,find(v==a+w))
 


oder ich hab vlt Thomas falsch verstanden.
Zitat:

die oberere Grenze (supremum) .....


gruss
Fourier
_________________

Ein schlechter General ist besser als zwei gute.
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2010, 16:59     Titel:
  Antworten mit Zitat      
Hallo zusammen,

danke für die Antworten. Ich werde die Ansätze ausprobieren. Meines Erachtens sollten beide Vorschläge funktionieren. Danke dafür. Ich werde berichten.

Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2010, 16:10     Titel:
  Antworten mit Zitat      
So, ich habe das jetzt einmal ausprobiert und festgestellt, dass ich doch das untere Element benötige.

Also:

Beispiel Spaltenvektor V=[1,2,5,6,7]' ; Gegebener Wert 5,7 ... die oberere Grenze (supremum) für die gilt, dass (i-1)*1<=5,7 ist also 5 und die 5 ist das i=3 Element im Spaltenvektor V.

Ich versuche das jetzt einmal analog zum dem, was ihr mir empfohlen habt umzusetzen; falls ihr noch andere Gedanken habt, dann wäre ich dafür sehr dankbar.

Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 30.07.2010, 09:46     Titel:
  Antworten mit Zitat      
Moin thomas0815,

kannst Du bitte noch sagen, was heraus kommen muss, wenn der Vektor [1 2 3 4 5 5.6 6 7 4 3 5.6] bzw. [1 2 3 4 5 5 6 7 4 3 5] lautet?
Oder kann kein Element doppelt vorkommen?
Oder wird nur das erste dichteste gebraucht?

Ciao,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2010, 18:58     Titel:
  Antworten mit Zitat      
Hallo,

also ich bin jetzt dazu gekommen das Ganze einmal umzusetzen.

Es ist so, dass das obere Element gesucht wird. Ich habe es deswegen nach diesem Vorschlag umgesetzt:

[a,b]=min(abs(V-5.7));

das funktioniert, weil der Absstand zwischen den Elementen immer gleich ist. Ich habe also einen Vektor mit der Intervallbreite 1

V=[2,3,4,5,6,7,8,9,10]; jetzt habe ich einen Wert von 5,3. mit min(abs(V-Wert) würde 5 (Element 4) gewählt werden, was falsch ist - es muss 6 (Element 5) gewählt werden.

wenn ich jedoch die hälfte der Intervallbreite von 1 (also 0,5) zu dem Wert addiere, komme ich auf 5,3+0,5=5,8 - damit wäre das nächste Element mit minimalen Abstand die 6 also auch Element 5. Das funktioniert auch, wenn der Wert 5,7 beträgt; jetzt würde zwar ohnehin das Element 5 gewählt, weil es das Element mit dem minimalen Abstand ist. Addiere ich jetzt aber trotzdem die 0,5 dazu, komme ich wieder auf Element 5. Damit gilt allgemein:

Code:
[a, b]=min(abs(V-(Wert+(Intervallbreite/2))));


Danke für die Hinweise.

Viele Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2010, 20:01     Titel:
  Antworten mit Zitat      
Hallo Fourier,

kann ich mir hier auch Element und Index ausgeben lassen?


Code:
v=[1 2 5 6 7];
w=5.2;
x=v-w;

a=min(x(x>0));
sprintf('die %d, das %d.te Element',a+w,find(v==a+w))


Danke und Gruß, Thomas[/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 24.08.2010, 21:31     Titel:
  Antworten mit Zitat      
Hallo,

der Code machte eigentlich schon was du suchst:
Code:

v=[1 2 5 6 7];
w=5.2;
x=v-w;

element=min(x(x>0))+w;
index=find(v==element);
 


gruss
_________________

Ein schlechter General ist besser als zwei gute.
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2010, 11:08     Titel:
  Antworten mit Zitat      
Hallo,

danke für die Antwort. Das Problem scheint doch größer als gedacht. Ich habe in meiner Wert-Matrix, für die ich das umsetzen möchte, mehrere Werte die nicht im Vektor V vorkommen, auch -inf Werte. Damit funktioniert die find Funktion nicht. Kennt jemand noch Alternativen?

Ein einfaches Beispiel:

Code:
V=[0 1,2,3,4.5,5.5,6,7,8,9]
n=10
Wert=[1 3.3 4.2 1.4 5.6 8.9 7.5 7.8 128 5.6]'

for i=1:n
x=V-Wert(i);

element=min(x(x>0))+Wert(i);
index(i)=find(V==element)
end


Danke und Gruß,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 25.08.2010, 11:52     Titel:
  Antworten mit Zitat      
Hallo,
Code:

element=min(x(x>0))+Wert(i);
index(i)=find(V==element)


es kann ja auch nicht funktionieren element ist ein vektor.also wenn dann so:
Code:

element(i)=min(x(x>0))+Wert(i);
index(i)=find(V==element(i))
 


Frage:
was sollte denn bei element und index rauskommen wenn der vektor "Wert" zahlen ausserhalb des bereichs oder -inf werte hat??

gruss
_________________

Ein schlechter General ist besser als zwei gute.
Private Nachricht senden Benutzer-Profile anzeigen
 
thomas0815
Themenstarter

Forum-Century

Forum-Century


Beiträge: 153
Anmeldedatum: 13.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2010, 12:05     Titel:
  Antworten mit Zitat      
Hallo,

danke für den Hinweise, hätte mir selber auffallen können. Ich werde das dann gleich ausprobieren.

Bei -inf sollte z.B. das nächst größere verfügbare Element gewählt werden, in diesem Fall 0.

Grüße,
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 25.08.2010, 12:19     Titel:
  Antworten mit Zitat      
da du nur die Hälfte meiner frage beantwortet hast, habe ich bei index und element NaN gesetzt wenn der wert von "Wert" ausserhalb des bereiches liegt.
Code:

clear all
V=[0,1,2,3,4.5,5.5,6,7,8,9];
n=10;
Wert=[1 -inf 4.2 1.4 5.6 8.9 7.5 7.8 128 5.6];

element=zeros(1,length(V));
index=zeros(1,length(V));

for i=1:n
x=V-Wert(i);

if(all(x<0))
    element(i)=NaN;
    index(i)=NaN;
   
elseif(all(isinf(x)))
    element(i)=min(V);
    index(i)=find(V==element(i));
       
else
    element(i)=min(x(x>=0))+Wert(i);
    index(i)=find(V==element(i));
end
end
 

_________________

Ein schlechter General ist besser als zwei gute.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.