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

Überprüfen ob ein Wert in einem bestimmten Intervall liegt

 

Hansdampf
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 17.12.10
Wohnort: Mannheim
Version: ---
     Beitrag Verfasst am: 31.01.2011, 18:00     Titel: Überprüfen ob ein Wert in einem bestimmten Intervall liegt
  Antworten mit Zitat      
Hallo zusammen,

ich denke ich habe ein wirklich einfaches Problem, nur komm da nicht weiter.
Ich will nur überprüfen ob ein Wert in einem bestimmen Intervall liegt oder nicht. Kann ich das nur durch >,< u.s.w abfragen oder gibt es für diesen Fall nicht auch einen eigenen Befehl?
Danke für eure Bemühungen
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.01.2011, 18:08     Titel:
  Antworten mit Zitat      
Hallo,

Code:
if a < x && x < b
...
end

Das ist so einfach, dass ich mir nicht vorstellen kann, dass es dafür einen eigenen Befehl gibt. Du kannst dir natürlich einen Befehl basteln:
Code:
function tf = isin(x,a,b)
tf = a < x && x < b;

und das dann so aufrufen:
Code:


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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: 31.01.2011, 20:21     Titel: Re: Überprüfen ob ein Wert in einem bestimmten Intervall l
  Antworten mit Zitat      
Hallo Hansdampf,

Für einen Scalar würde ich den von Harald vorgeschlagenen Weg wählen, also "low < Data && Data < high".
Wenn Du testen möchtest, of in einem riesigen Array irgendein Wert ausserhalb der Limits liegt, ist das aber ineffizient, weil große temporäre LOGICAL Arrays erzeugt und per AND verknüpft werden müssen. Deshalb mache ich soetwas mit einer C-Mex-Funktion:
http://www.mathworks.com/matlabcent.....eexchange/27857-anyexceed
Wenn z.B. bei einem [1 x 1e6] Vector bereits der erste Wert ausserhalb liegt, ist der Rechen- und Speicher-Aufwand mit dem C-Mex verschwindent gering.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Hansdampf
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 17.12.10
Wohnort: Mannheim
Version: ---
     Beitrag Verfasst am: 01.02.2011, 11:28     Titel:
  Antworten mit Zitat      
Guten Morgen,
Danke für eure Antworten. In meinem Fall reicht sicherlich die einfache <&&> Lösung. Stimmt wirklich, dass diese an Einfachheit schwer zu überbieten ist. Ich dachte nur..... Matlab hat sonst für fast jeden Fall einen eigenen Befehl.

Gruß
Hansdampf
Private Nachricht senden Benutzer-Profile anzeigen
 
fhuenger
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 25.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2012, 19:55     Titel: arrays unterschiedlicher zeilen- und spaltenlänge
  Antworten mit Zitat      
servus erstmal an alle!

ich habe folgendes Problem, ich habe zwei arrays unterschiedlicher länge, jeder hat 2 spalten.
in der ersten spalte stehen start-, in der zweiten jeweils die endwerte einer eigenschaft.
ich möchte wissen ob und wenn dann welche zeile (bereich zwischen start- und endwert) des ersten arrays in irgendeinem bereich des 2. arrays (wieder zwischen start- und endwert jeder zeile) vorkommt.
so viel zur theorie, ich hoffe man kann das verstehen Wink

Dank der anyExceeds.m habe ich es zwar geschafft, allerdings ist meine Programmierung furchtbar und eine in diesem fall [35088,125]- große matrix würde ich mir auch gern sparen, da mich eigentlich nur die entsprechenden Zeilen welche Nullen enthalten interessieren! Die Zugehörigkeit muss allerdings weiter erkennbar sein.

Das größte Problem war für mich, dass sowohl die zeilen, als auch die spaltenlängen (start- bis endwert können ja eine unterschiedliche differrenz haben) variieren.

Hier jetzt mein Code, ich hoffe ihr könnt mir helfen diesen zu verbessern!

Code:

if length(a(:,1)) > length(b(:,1));
    c(1:length(a(:,1)),1:2) = nan;
    c = padadd(b,c);
    c(:,3:4) = [];
else
    c(1:length(b(:,1)),1:2) = nan;
    c = padadd(a,c);
    c(:,3:4) = [];
end

pp = nan(length(c(:,1)) * length(b(:,1)),max(c(:,2) - c(:,1)) + 1);
for n = 1:length(c(:,1));
    d = c(n,1):c(n,2);
    for n2 = 1:(c(n,2) - c(n,1) + 1);
%         disp(d(n2));
        for n3 = 1:length(b(:,1));
            nn = n*length(b(:,1)) - length(b(:,1)) + n3;
            if d(n2) > b(n3,2);
                pp(nn,n2) = 1;
            else
%                 disp(b(n3,1));
                pp(nn,n2) = anyExceed(d(n2),b(n3,1),b(n3,2));
            end
        end
    end
end

 



anbei habe ich die arrays a(204,2) und b(172,2) angehangen.

für ideen bin ich wahnsinnig dankbar!

a_b.rar
 Beschreibung:
a/b.mat

Download
 Dateiname:  a_b.rar
 Dateigröße:  2.18 KB
 Heruntergeladen:  352 mal
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: 06.07.2012, 14:28     Titel: Re: arrays unterschiedlicher zeilen- und spaltenlänge
  Antworten mit Zitat      
Hallo fhuenger,

Ich habe die Frage zweimal durchgelesen und noch nicht verstanden. Deshalb zunächst mal ein kleiner Hinweis:

length(b(:,1))

Dies erstellt zunächst einen neuen Vektor und kopiert dann die Werte aus der ersten Spalte der Matrix b. Da aber nur die Länge benötigt wird, ist dies deutlich effizienter:

size(b, 1)

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
fhuenger
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 25.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2012, 15:50     Titel:
  Antworten mit Zitat      
ok gut zu wissen Wink

ich versuch es noch einmal besser zu erklären:

ich habe 2 arrays unterschiedlicher länge welche in der ersten spalte jeweils die startframes und in der zweiten die endframes anzeigen.
ich möchte quasi vergleichen welche bereiche (jeweils zwischen start-und endframe) sich "überlappen" mit denen des anderen arrays!

danke für deine mühen!
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: 07.07.2012, 15:45     Titel:
  Antworten mit Zitat      
Hallo fhuenger,

Überlappen sich die Intervalle innerhalb der Arrays?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
fhuenger
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 25.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2012, 19:24     Titel:
  Antworten mit Zitat      
ja das machen manche und genau diese möchte ich ja herausfinden!
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: 08.07.2012, 13:25     Titel:
  Antworten mit Zitat      
Hallo fhuenger,

Nochmal: Du hast die Arrays A mit der Größe [M x 2] und B mit [N x 2]. Nun ist meine Frage, ob die Intevalle innerhalb von A sich überlappen können, und auch innerhalb von B. Dies ist für den Algorithmus wichtig, wenn man nach Überlappungen zwischen A und B sucht.

Und nochmal explizit (obwohl es eigentlich Deine Aufgabe wäre, das Problem so verständlich wie möglich zu erklären):
Code:
% Ist dies möglich:
A = [1:10;
    2:11];
% oder sind alle Intervalle garantiert überlappfrei:
A = [1:10;
    12:18];

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
fhuenger
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 25.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.07.2012, 14:47     Titel:
  Antworten mit Zitat      
Entschuldigung, das habe ich vergessen explizit zu erwähnen!
Alle Intervalle innerhalb von A, bzw. innerhalb von B überlappen sich nicht!
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: 10.07.2012, 21:35     Titel:
  Antworten mit Zitat      
Hallo fhuenger,

Hast Du eventuell einen kleinen Beispiel-Datensatz? Das würde weitere Fragen klären, z.B. ob die Werte Integers sind (womit dan eine Indexing-Methode infrage käme), oder ob HISTC die geeignete Wahl ist, welchen Typ die Werte haben (DOUBLE oder UINT16?), etc. Sind beide Intzervall-Listen sortiert und heißt "die Startwerte stehen in der ersten Spalte", dass dies die untere Grenze des Intervalls ist? Möchtest Du die Grenzen ein- oder ausschließen, oder konkret:
Code:
A = [1, 2];
B = [2, 3];

Gilt dies als Überlapp oder nicht?

Ich verstehe den geposteten Code nicht - Kommentare wären hier hilfreich. Wozu dient z.B. das "padadd"?

Es wäre nicht effizient, wenn ich hier Code poste, der ein Problem löst, dessen Details ich errate. Solche Halb-Lösung sind meistens sogar schädlich, da die Versuche den Code an das echte Problem heranzubiegen fehleranfällig und zeitraubend ist.

Gruß, Jan

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
fhuenger
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 25.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2012, 18:18     Titel:
  Antworten mit Zitat      
warum ich nicht von selbst drauf komme alles so zu beschreiben, sorry!

jedenfalls sind a & b vom typ DOUBLE und ganze zahlen, aber keine integer, isnumeric trifft zu.

es sind beide Intervall-listen in sich sortiert und jeweils die erste Spalte gibt die UNTERE GRENZE und die zweite Spalte die OBERE GRENZE des jeweiligen Intervalls an. Die Grenzen möchte ich mit einschließen!
Code:

% if-schleife sorgt dafür, dass beide arrays die gleiche länge besitzen,
% also der kürzere mit nan's aufgefüllt wird.
if size(a,1) > size(b,1);
    c(1:size(a,1),1:2) = nan;
    c = padadd(b,c); % padadd ist die funktion welche Spalten unterschiedlicher Länge zum array hinzufügt
    c(:,3:4) = [];
else
    c(1:size(b,1),1:2) = nan;
    c = padadd(a,c);
    c(:,3:4) = [];
end

hier nun ein einfacher kleiner Beispielcode für die arrays:
a = [1,1;3,4;8,11;14,17];
b = [2,3;7,11;14,14;16,21;23,23];
 

gewünschte ergebnisausgabe:
- Zeilenanzahl entspricht size(a/b,1), je nachdem welcher der beiden Arrays als zu vergleichender gewählt wird
- '0' für keine Übereinstimmung mit irgendeinem Intervall des anderen Arrays
- entsprechende 'Zeilennummer' bei Übereinstimmung als Wert in der jeweiligen Zeile

für obiges Beispiel:
- b mit a verglichen: ans = [2;3;4;4;0] (5*1)
ist für das Beispiel die einfache Variante, aber in meinem Datensatz kann auch folgendes auftreten:

- a mit b verglichen: ans = [0;1;2;3,4] (4*2)
somit würde sich ein 4*2 array ergeben, da sich das Intervall a(4,..) sowohl mit b(3,..) als auch mit b(4,..) überlappt
hierzu müsste der antwort-array gedreht, mit padadd zusammengefügt und die restlichen werte mit nan aufgefüllt werden
also ans = [0,nan;1,nan;2,nan;3,4]
falls dir eine bessere lösung einfällt kannst die gern anwenden, jedoch muss ich irgendwie auf die einzelnen Zeilen bei
mehrfach-Übereinstimmungen zugreifen können (die Lösung mit padadd ist nur ein Lösungsvorschlag, mir fällt keine andere ein)
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 13.07.2012, 13:27     Titel:
  Antworten mit Zitat      
Hallo,

falls das ganze performancekritisch ist, würde ich das mit Binäre-Suche machen: http://de.wikipedia.org/wiki/Bin%C3%A4re_Suche

Grüße, Marc
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.