Matrixoperation wie zwei Matrixwerte miteinander vergleichen
Meli
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 17.05.2013, 09:46
Titel: Matrixoperation wie zwei Matrixwerte miteinander vergleichen
Hallo ihr Lieben,
ich komme gerade leider absolut nicht mehr weiter und auch google konnte mir nicht helfen, deshalb poste ich jetzt hier. Vllt wisst ihr ja weiter :)
Ich versuche mein problem erstmal so zu beschreiben:
Ich möchte Messdaten von n Textfiles (mesn.txt) einlesen. Diese sollen mit den Referenzdaten einer weiteren Textdatei (ref.txt ) verglichen werden und dementsprechend die Differenz gebildet werden.
Wäre eigentlich nicht schwer, wenn die Referenzdatenmatrix = Messdatenmatrix wäre.
Nun ist es aber so dass nicht zu jeder Referenzzeit Messungen vorliegen, sprich, mal nur jede 2te Sekunde, dann doch mal wieder jede Sekunde etc. Damit ihr euch das ganze vorstellen könnt:
so sehen meine eingelesenen Matrizen der Referenzdatei aus:(X-WertMatrix, Y-WertMatrix,ZeitMatrix)
und so meine Messdatenmatrizen:
Jetzt möchte ich die Differenzen zwischen den XWerten bilden, die die selbe zeit haben, also zum Bsp: deltax4=ref(x4)-mes(x2) % (x2, da bei 0.04sec erst der zweite X-Wert gemessen wurde)
so und das ist jetzt mein Problem, wie löse ich es?
meine bisherige Idee funktioniert leider nicht, bzw, weiß ich nicht, wie ich (da es einige 1000Messdaten sind) auf das x2 zugreifen soll, welches sich ja ständig ändert. Ich poste mal wa sich bis jetzt gemahct habe:
function delta =ber_delta (refzeit, X1,X2,Y1,Y2) % der Funktion zu übergebene eingelesene Matrizen, wobei refzeit, X1 und Y1 aus der Referenzdatei sind
delta.deltax=[];
delta.deltay=[];
d=1;
for i=0:0.01:50 %for-Schleife, um herauszufinden, für welche Zeiten Messdaten vorliegen
if any(refzeit(d,:)==i %falls für die jeweilige Zeit Messdaten vorliegen, berechne delta
delta.deltax=X1-??? %und wie kann ich jetzt die Stelle in der refdatei herausfinden,bzw in der erzeugten X-Wertematrix, wo der Messwert zur refzeit steht?
delta.deltay=Y1-???
xref=[1,2,3,4,5,6,7,8,9,0];
zeitref=[1,2,3,4,5,6,7,8,9,0];
x=[1,4,5,3,4,456,6];
zeit=[1,3,4,6,8,9,0];
dx=nan(size(zeit));
for j=1:length(zeit)
dx(j)=x(j)-xref(zeitref==zeit(j));
end
so würde ich das machen. für y dann analog
beim nächsten mal bitte die code umgebung benutzen das macht es einfacher zu lesen.
Meli
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 17.05.2013, 11:41
Titel:
Das ging ja schnell und einfach und zermatter mir mein Kopf ewig lang
Ich werds gleich mal ausprobieren... Aber ich verstehe nicht so ganz, was das bedeutet:
(wo aktivier ich denn die Codeumgebung?, sorry schriebe das erste mal hier...)
dx=nan(size(zeit))
nan=google:NaN returns the IEEE® arithmetic representation for Not-a-Number (NaN).
und jetzt im wahrsten sinne des wortes auf deutsch?
nan erzeugt eine matrix mit allen einträgen auf nan. das ist nur dafür da speicher zu reservieren da sonst die forschleife erheblich langsamer läuft da bei jedem neuen index eine neue matrix angelegt wird, der inhalt der alten matrix kopiert wird und so weiter. das braucht bei großen matritzen nacher sehr viel zeit. darum immer vorher speicher anlegen. außerdem brauchst du den nan befehl auch nicht googlen. dafür ist ja die code umgebung da. du kannst das blaue nan gleich anklicken und wirst auf die matlab seite weitergeleitet wo der befehl erklärt ist. oder du guckst in der doc
ok,vielen Dank für deine Hilfe
funktioniert einwandfrei!
Meli
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.05.2013, 08:49
Titel:
Hallo,
ich habe doch noch mal eine Rückfrage...(kann ich das schon hier posten, oder soll ich lieber einen neuen Thread aufmachen?)
ich komm immer noch nicht so ganz klar mit den logischen Operatoren...
Und zwar möchte ich jetzt alle deltas von Zeitpunkt 1 (und dann von den jeweilig anderen Zeitpunkten auch) in eine neue Matrix speichern weil sonst die Weiterverarbeitung sehr umständlich ist. Das habe ich eigentlich auch hinbekommen, nur stehen jetzt in den Spalten und Zeilen, wo keine Messungen vorliegen, Nullen.
Da ich als nächstes mit den deltas rechnen möchte, sollten auch nur die miteingezogen werden, die wirklich aus der Differenz der ref-Daten und der eigentlichen Messung resultieren.
Da es aber auch vorkommen kann (zwar unwahrscheinlich, aber trotzdem) das ein Delta Null ist, aknn ich jetzt nciht einfach alle Nullen ersetzen. Ich möchte stattdessen ein Wert oder irgendwein Zeichen stehen haben, welches bei Berechnungen ignoriert wird.
Mein bisheriger Code:
Code:
for t=1:length(zeitref) for n=1:10% z.Beispiel sollen die berechneten dx'es von den ersten 10 Textfiles genommen werden und in eine neue Matrix geschrieben werden:
ifany(delta(n).t==zeitref(t))% Falls in delta der Zeitpunkt t vorkommt...
deltax(1,zeitref==(delta(n).t(j)))=delta(n).dx(j); % Schreibe -in die 1.Zeile der neuen deltax-Matrix und in die Spalte, in der der zeitref-Wert gleich dem Zeitpunkt, zudem die Messung erfolgt ist- den Wert von dx. Das funktioniert auch soweit nur:
else% Und wie kann ich schreiben, dass sonst was anderes z. Bsp 'LEER' oder so stehen soll? Mein Problem ist, dass ich die Stelle in deltax nicht lokalisieren kann wie oben, da es in dem fall die stelle (1,zeitref==(delta(n).t(j) )) nicht gibt?
ich kann das genze nicht wirklich nachvollzihene da ich nicht weis wie du deine struct angelegt hast etc. aber du könntest schon wieder anstadt 0 ein nan setzen. dann kommt bei berechnungen auch nan raus. oder du gibst schnell noch ein lauffähiges beispiel.
ach ja meist ist es besser ein neues thema zu starten da sonst der beantwortet status hinfällig wird
Meli
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.05.2013, 08:49
Titel:
ok habe mal ein kleines Beispielprogramm geschrieben:
ich habe drei verschiedene delta Objekte mit den deltaWerten und der zugehörigen Zeit, zu der das delta aufgenommen wurde. Jetzt sollen in einer neuen Matrix, jeweils in derselben Spalte, in der die Referenzzeit steht, die deltas, die zum selben Zeitpunkt aufgenommen wurden, stehen.
for n=1:3 for r=1:length(Referenzzeit) ifany(delta(n).Messzeit==Referenzzeit(r)) for j=1:length(delta(n).dx)
deltax_neu(n,Referenzzeit==(delta(n).Messzeit(j)))=delta(n).dx(j);
end end end end
Und wenn ich jetzt zum Beispiel das Mittel aus den jeweiligen Spalten berechnen will, verfälscht mir eine Null ja das Ergebnis. Wie kann ich an die Stellen, wo delta keinen Wert hat, was anderes schreiben?
Ist es jetzt etwas klarer, was ich meine?
Wäre super, wenn ihr nochmal drüber schauen könntet
Referenzzeit=[0.05,0.06,0.07,0.08,0.09,1.00,1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10,1.11];
dxneu=nan(3,length(Referenzzeit));
%%
for k=1:3
dxneu(k,(ismember(Referenzzeit,delta(k).Messzeit)))=delta(k).dx;
end for k=1:length(Referenzzeit)
dxmean(k)=mean(dxneu(not(isnan(dxneu(:,k))),k));
end
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.