Verfasst am: 07.11.2015, 12:01
Titel: Echzeit, if-Schleife, Error using ~=
Hallo liebes Forum,
bin Anfänger und suche Rat. Leider ergaben mir meine bisherigen Recherschen nicht neues, zu dem Thema.
Ausgangssituatuion:
Daten werden kontinuierlich in Matlab eingelsen über eine Serielle-Schnittstelle. Die Daten werden bearbeitet und gefiltert. Alles bisher läuft wunderbar.
So nun zu dem Problem:
Es werden zwei Werte gleichzeitig eingelsen von zwei Sensoren. Die Daten haben nur die Werte 1 und 0.
Bsp.:
Was will ich:
Wenn im Wert 1 und Wert 2 die Zahl 1 erscheint, soll ein einfacher Befehl erstmal ausgeführt werden. Dies wollte ich mit einer if Schlefe bewerkstelligen:
Doch ich bekomme immer die Fehlermeldung:
Error using ~=
Matrix dimensions must agree.
Error in v019 (line 83)
if wert1~=wert2;
Stehe im Moment ziemlich auf dem Schlauch. In Foren finde ich bislang nur den Hinweis, dass ein "." bei dem Zeichen "/" eingetragen werden muss. Doch ich habe kein Backslash Zeichen in meinem Code.
es würde mich wundern, wenn die Fehlermeldung von genau dem Code kommt, denn du verwendest ja == statt ~=.
Zitat:
Wenn im Wert 1 und Wert 2 die Zahl 1 erscheint,
Heißt das nun:
- Wenn an einer bestimmten Stelle bei beiden die 1 erscheint
- Wenn an irgendeiner Stelle bei beiden die 1 erscheint
- Immer, wenn an einer Stelle bei beiden die 1 erscheint
oder vielleicht noch etwas anderes?
Der == Operator (und auch der ~= Operator, der in der Fehlermeldung erscheint) ist ein elementweiser Vergleich. Dazu müssen beide Operanden, also was rechts und links des Operators steht, entweder die gleiche Dimension haben, oder einer ist ein Scalar.
Es gibt keine "if-Schleifen". Nur FOR und WHILE erzeugt eine Schleife.
schreibst, und a oder/und b ist ein Array, wird auch "a==b" ein Array der gleichen Größe sein. Die IF-Bedingung muss aber ein scalar sein, deswegen wird intern ausgeführt:
Zitat:
if all(a(:) == b(:)) && ~isempty(a == b)
Das heißt: Wenn kein Element der Bedingung FALSE ist und die Bedingung nicht leer ist.
Die Fehlermeldung bei Dir besagt, dass Wert1 und Wert2 unterschiedliche Größe haben. Wie soll dann damit umgegangen werden?
Zunächst ist die Fehlermeldung nicht korrekt, die ich vorher reingestellt habe. In meinem Beispiel ist == im Code eingertragen, und in der Fehlermeldung ist ~= zu sehen. Habe hier den falschen Code reingestellt. Doch dieselbe Fehlermeldung erscheint auch, wenn ich ~= in den Code eintrage.
Zitat:
Heißt das nun:
- Wenn an einer bestimmten Stelle bei beiden die 1 erscheint
- Wenn an irgendeiner Stelle bei beiden die 1 erscheint
- Immer, wenn an einer Stelle bei beiden die 1 erscheint
oder vielleicht noch etwas anderes?
Immer, wenn an einer Stelle bei beiden die 1 erscheint
Da wo x ist, soll ein Befehl ausgeführt werden.
Die Länge der beisen Werte sindnicht gleich. Das Einlesen der Werte von den Sensoren findet gleichzeitig statt und geht auch "unendlich" weiter. Also ist die Länge der Werte ja unbekannt?
Zitat:
Es gibt keine "if-Schleifen". Nur FOR und WHILE erzeugt eine Schleife.
Logisch Hab da nicht mitgedacht.
Zitat:
Die Fehlermeldung bei Dir besagt, dass Wert1 und Wert2 unterschiedliche Größe haben. Wie soll dann damit umgegangen werden?
Ok jetzt versteh ich langsam das Problem.
Nur zu meinem Verständniss:
Bei einer If-Bedingung muss einer der Werte ein Skalar sein. Also als Beispiel:
Code:
Wert1=[00001111110000......]
Wert1(0);Wert1(0);Wert1(0);......%der Skalar in diesem Fall
Hmm merke auch gerade das ich hier einen Denkfehler hatte. In einer mathematischen Funktion würde dies, auch nicht funktionieren.
Ja meine Werte haben unterschiedliche Längen, da die Länge unbekannt ist. Die Werte werden ja kontinuierlich eingelessen und gehen theoretisch ins Unendliche.
Zitat:
Das heißt: Wenn kein Element der Bedingung FALSE ist und die Bedingung nicht leer ist.
Ok an dieser Stelle muss ich passen. Verstehe es leider nicht so ganz. Was ist genau mit FALSE gemeint?
Gibt es eine andere Möglichkeit um das Vorhaben zu lösen?
Das einzige was mir einfällt ist, dass ich eine Funktion erstelle, die die Werte 1 und 2 gleichzeitig vergelicht, und die Ergebnisse in eine Matrix abspeichert. Wobei ABER einer der Werte "konstant" sein müsste. Doch ich vermute mal, dass ich hier wieder mit dem Problem, mit den Dimensionen bekomme.
Kurzum was ich vorhabe: Daten werden gleichzeitig und kontinuierlich eingelssen. Wenn die einkommenden Werte einen bestimmten Wertebereich erreichen, soll ein Befehl, Funktion, oder oder ausgeführt werden.
Und hier gibt es ein prinzipielles Verständnis-Problem: Du hast hier einen statischen Vektor. Was genau bedeutet nun "da wo ein x ist"? Die Daten werden kontinuierlich über die serielle Schnittstelle eingelesen. Aber während des Einlesens läuft die Code, der den IF-Befehl enthält nicht, oder? Wie werden also die beiden Variablen Wert1 und Wert2 genau erzeugt?
Zitat:
Die Länge der beisen Werte sindnicht gleich. Das Einlesen der Werte von den Sensoren findet gleichzeitig statt und geht auch "unendlich" weiter. Also ist die Länge der Werte ja unbekannt?
Wenn das Auslesen gleichzeitig statt findet, sollten die Längen der Vektoren doch gleich sein. Und wenn es um eine Echtzeit-Anwendung geht, sollte eigentlich immer nur ein einzelner Messwert vorliegen.
Zitat:
Bei einer If-Bedingung muss einer der Werte ein Skalar sein.
Fast. Eine IF-Bedingung muss immer skalar sein. Sie wird dabei immer als logischer Ausdruck gewertet, also als Variable, die entweder 0 (also
true
) oder 1 (also
true
) enthält. (Beides sind Matlab-Befehle, klicke darauf um die Dokumentation anzuzeigen.) Das ist auch logisch, denn IF bedeutet ja: Falls die Bedingung wahr ist, führe diesen Code aus. Wenn man dann als Bedinung einen Vektor hat, der "wahr" und "falsch"-Werte enthält, würde es ja unlogisch werden.
Zitat:
Ja meine Werte haben unterschiedliche Längen, da die Länge unbekannt ist. Die Werte werden ja kontinuierlich eingelessen und gehen theoretisch ins Unendliche.
Wie schon gesagt: Das Problem klärt sich wahrscheinlich, wenn Du erklärst, wie die Daten erzeugt werden. Dann wird wohl auch klarer, was "gleichzeitig" bedeuten soll.
Das ist auch logisch, denn IF bedeutet ja: Falls die Bedingung wahr ist, führe diesen Code aus. Wenn man dann als Bedinung einen Vektor hat, der "wahr" und "falsch"-Werte enthält, würde es ja unlogisch werden.
Bingo. Klar. Nehmen wir aber an, der Wert 1 liefert Daten in einem Bereich zwischen 5 und 10. Dasselbe trifft für den Wert2 zu. Dennoch würde die IF Bedingung ja nicht funktionieren, da es ja keinen Skalar gibt. oder?
Dieser Fall kommt in meinem Beispiel nicht vor. Da die Daten von den Werten gleichzeitig eingelsen werden.
Anbei der Code. In den Kommentaren, ist dargestellt was ich gemacht habe.
Das Ziel der ganzen Geschichte soll es sein:
Daten werden von mehreren Sensoren eingelessen. Falls (in meinem Beispiel sind es nur zwei Sensoren) die Daten sich ähneln, oder in den selben Wertebereich kommen, soll ein Befehl weitergehen.
Bsp.: Wenn zwei Drucksensoren (Intern funktionieren beide über einen Wiederstandssensor) einen Druck zwischen 4 bar und 5 bar erreichen (angezeigt wird ein Wert zwischen 250 und 350) soll matlab einen Befehl ausgeben.
Mit einer Korrelation habe ich es bereits ausprobiert. Leider bringt sie mich nicht weiter, da der Wert Auf- und Abstieg einen unterschiedlichen Zeitverlauf haben.
Code:
%% clear, close COM clearall closeall clc if ~isempty(instrfind) fclose(instrfind) end
%% Load COM Setup 'ser'
ser=serial('COM3');
set(ser,'BaudRate',9600);
set(ser,'DataBits',8);
set(ser,'Parity','none');
set(ser,'StopBits',1);
set(ser,'ReadAsyncMode','continuous');
set(ser,'Terminator','CR/LF');
%% Open COM fopen(ser);
%% read and define data conti
k=1;
while(ser.Status == 'open');
k=k+1;
%% Spliting Data % An dieser Stelle kommen die daten im Format "0=160" bis "0=700" und "1=160" bis "1=700" herein. % 0 und 1 steht für den Anschluss-Port des Sensors. Nach dem "=" Zeichen ist der gesendete Wert aufgeführt.
data_ser_split =regexp(data_ser,'=','split');
data_ser_portNumber = str2num(data_ser_split{1});
data_ser_portValue = str2num(data_ser_split{2});
%Port Number
port0=0;
port1=1;
% Spliting Values, in case more Ports>more loops if data_ser_portNumber==port0;
port0_Value= data_ser_portValue;
port1_Value=data_ser_portValue*0;
else data_ser_portNumber==port1;
port1_Value = data_ser_portValue;
port0_Value=data_ser_portValue*0;
end % Define Ports
wert1zero(k) = port0_Value;
wert2zero(k) = port1_Value;
wert1 = wert1zero(wert1zero~=0);
wert2 = wert2zero( wert2zero~=0);
%% Define Range for Data, Equilibrium % Hier werden die Werte einfach auf 100 Stelle ausgegeben. Dies wurde % gemacht, damit die theorertisches Rechnung, später einfach gemacht werden % kann, nachdem die Daten ausgelesen wurden.
%define range Value for wert1
wert1minValue=160;
wert1maxValue=550;
wert1(wert1<160) = wert1minValue;
wert1(wert1>550) = wert1maxValue;
wert1maxmin=wert1;
% Value in percent
wert1p=(wert1maxmin-wert1minValue)*(100/(wert1maxValue-wert1minValue));
%define range Value for wert2
wert2minValue=160;
wert2maxValue=550;
wert2(wert2<160) = wert2minValue;
wert2(wert2>550) = wert2maxValue;
wert2maxmin=wert2;
% Value in percent
wert2p=(wert2maxmin-wert2minValue)*(100/(wert2maxValue-wert2minValue));
%% Filter % Hier findet einfach eine Filterung der Werte statt.
Fs=300;
[b,a] = butter(8,40/(Fs/2),'low');
%Filterfor Signal
wert1f = filter(b,a,wert1p);
wert2f = filter(b,a,wert2p);
wert1f(wert1f<0) = [];
wert2f(wert2f<0) = [];
%% Range-Condition % Genau hier liegt nun mein Problem. Da ich mit der Korrelation nicht % weiterkomme, wollte ich folgendes durchführen: Wenn die gesendeten Werte % in einen definierten Bereich kommen (und zwar wenn beide gleichzeitig, % oder nur einer), dann soll ein weiterführender Befehl, oder eine weitere % Berechnung durchgeführt werden.
con1_wert1=(wert1f>=0 & wert1f<=20);
con1_wert2=(wert2f>=0 & wert2f<=20);
wert1_activ=+con1_wert1;
wert2_activ=+con1_wert2;
%% Output-Condition % So hier genau hier liegt das Problem
a1=wert1_activ;
a2=wert2_activ;
if a1==a2
disp('ok') else disp('no') end
% Fehlermeldung % no % no % no % no % Error using == % Matrix dimensions must agree. % % Error in v (line 93) % if a1==a2
hat mich jetzt zu dem eigentlichen Problem gebracht! Danke.
Die einkommenden Werte haben IMMER eine unterschiedliche Länge. Es wird ja einer nach dem anderen eingelsen. Also ist ein Wert immer um eine Stelle im Voraus.
Ich sehe auch gerade, dass es manchmal vorkommt, wie in deinem Beispiel, dass der erste Sensor Werte liefert, aber der andere noch keine gesendet hat.
Doch wie löse ich nun das Problem?
In meinem Code habe ich bereits eine IF Bedingung, bei der ich auf dieses Problem gestossen bin. Dort Habe ich einfach gesagt, dass für den anderen Wert, der gelesen Wert eingetragen werden soll. Somit hat sich ja das Problem gelöst.
Gibt es eine elegantere Lösung Vektoren mit unterschiedlichen Längen zu "multiplizieren" besipielsweise??
Ich sehe noch keine Lösung für das Problem, denn es geht ja um die Korrelation gleichzeitiger Messdaten, aber bisher liegt die Information welche Daten gleichzeitig sind noch gar nicht explizit vor.
Woher kann das Programm also wissen, welche zwei Elemente zusammen gehören?
bislang kocht nur mein Kop, ich weiß einfach net mehr weiter.
Zitat:
denn es geht ja um die Korrelation gleichzeitiger Messdaten
Genau hier liegt ja das Problem. Wenn die Länge eines Messwertes nicht bekannt sein kann, wie soll man dann einen Vergleich zwischen zwei Datensätzen herstellen können? Die Korrelation benötigt "in meinem Fall" die Zeit Doch wenn ich nicht weiß, wie lange der die Sensoren Daten liefern, kann ich auch keine Korrelation machen.
Zitat:
aber bisher liegt die Information welche Daten gleichzeitig sind noch gar nicht explizit vor
Würde es helfen, wenn ich die geliferten Daten als mat File hochlade?
Zitat:
Woher kann das Programm also wissen, welche zwei Elemente zusammen gehören?
Jap danke für den Hinweis. Hab gerade gelesen, dass für Matlab eine 1/0 ein Wert ist und nicht wie ich dachte Na. (1 * Nichts ergibt Nichts, Nichts in deisem Fall ist nicht 0 ) Ist ein gewlatiger Unterschied. Ich mache es mal einfacher und setze für die 0 und 1 einen konkreten Wert ein. Für die 0 eine 2 und für die 1 eine 3.
Und was will ich:
Liebes Programm, sollange bei Wert2 ein Na vorhanden ist, mach nichts. Sobald bei Wert2 eine Zahl erscheint, vergleiche bitte diese Zahl mit der der Zahl bei Wert1, die sich an "derselben" Stelle befindet. Ich glaube, dass "derselben" in diesem Fall ein Problem wird. Da Wert2 nicht bislang geliefert und ML nicht weiß, wo das sein soll.
Doch man könnte doch auch sagen
Liebes Programm, warte bis alle Sensoren Werte liefern und fange an sie zu vergleichen, ab einem bestimmten Punkt.
Man merkt Dir an, das Dir der Kopf raucht. Ich vermute, dass Dir eine Pause gut tun wird.
Was meinst Du mit "Na"? Meinst Du den Double-Wert NaN? Das ist ein Skalar und damit eindeutig nicht "nichts".
Ich verstehe nicht, wieso Du als Beispiel die 0 durch eine 2 ersetzt und die 1 durch eine 3. Das ändert doch am Problem nichts, oder?
Zitat:
Liebes Programm, sollange bei Wert2 ein Na vorhanden ist, mach nichts.
Hier belibt immer noch das Kernproblem: Du hast zwei Vektoren mit z.B. der Dimension [1 x 3]. Beide liegen gleichzeitig während des Programmablaufs vor. Was bedeutet dann genau "solange"? Du bräuchtest also wohl noch eine Schleife über die Elemente der vorliegenden Vektoren?
Zu warten, bis alle Sensoren Werte liefern, klingt nach einem sinnvollen Ansatz. Aber auch dann ist nicht sicher, dass pro Schleifendurchlauf pro Sensor nur ein einzelner Wert ausgelsen wird. Und dann können sich immer noch die Anzahl der Daten unterscheiden.
ein sehr guter Ansatz von dir, mir eine Pause zu gönnen.
Nach 3 Pils und reichlicher Überlegung, habe ich festgestellt, dass mein Lösungsweg falsch ist. Denn später sollen noch beliebig viele Sensoren angschlossen werden, und alle untereinander verglichen werden.
Ich mache mal an diesem Punkt jetzt ein Schlussstrich. Bedeutet aber nicht das ich aufhöre weiterzumachen.
Eine Überlegung ist die Berechnung über Radianten zu lösen. Sobald ich dem Ziel näher gekommen bin werde ich mal hier ein paar Beispiele posten nunter einem anderen Titel.
Auch wenn ich nicht weitergekommen bin, danke für deine Hilfestellung, denn jetzt weiß ich wie es nicht funktionieren kann, ist genauso viel wert.
Gruß
Marko
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
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.