Verfasst am: 31.01.2011, 18:00
Titel: Überprüfen ob ein Wert in einem bestimmten Intervall liegt
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
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 ;)
Verfasst am: 31.01.2011, 20:21
Titel: Re: Überprüfen ob ein Wert in einem bestimmten Intervall l
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.
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.
Verfasst am: 05.07.2012, 19:55
Titel: arrays unterschiedlicher zeilen- und spaltenlänge
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
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:
iflength(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
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:
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!
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];
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:
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.
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. ifsize(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)
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
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.