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

Berechnen von Differenzen nur dann, wenn Werte vorhanden

 

lgigu
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 07.08.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2018, 15:18     Titel: Berechnen von Differenzen nur dann, wenn Werte vorhanden
  Antworten mit Zitat      
Hey,
ich bin Anfännger und stehe vor einem eigentllich einfachen Problem.

Ich habe verschiedene Messwerte in der Form M(i,j)
Das i ist ein laufender Index und durchgehend vergeben.
ich möchte jetzt automatisch den Betrag der Differenzen S(j,j) zwischen allen Messwerten ausrechnen lassen.
Allerdings nur zwischen Messwerten, bei denen i gleich groß ist, und nur dann wenn ein j definiert ist.

Beispiel, ich habe:
M(1,3) M(1,4) M(1,7) M(2,3) M(2,6)

Jetzt möchte ich automatisch meine Strecken S für alle i berechnen lassen, also:

S(j1,j2)=abs(M(i,j1)-M(i,j2))
S(3,4)=abs(M(1,3)-M(1,4))
S(3,6)=abs(M(2,3)-M(2,6))

Aber nicht:
S(4,6)=abs(M(1,4)-M(2,6)) weil dann das i unterschiedlich ist,
und kein S(1,3) weil es kein j=1 gibt.

Wichtig ist, dass ungültige S garnicht erst erstellt werden, auch nicht mit S=NAN.

Weiß einer eine gute Lösung?
Private Nachricht senden Benutzer-Profile anzeigen


J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 14.08.2018, 07:24     Titel:
  Antworten mit Zitat      
Hallo lgigu,


Zitat:

[...] ich möchte jetzt automatisch den Betrag der Differenzen S(j,j) zwischen allen Messwerten ausrechnen lassen. [...]
M(1,3) M(1,4) M(1,7)


Was heißt alle Differenzen? Immer die Differenz zwischen "nebeneinander" stehenden Einträgen? Aso für oben stehendes Beispiel:
S(3,4) und S(4,7) -> Variante 1
Oder tatsächlich alle? Also:
S(3,4), S(4,7) und S(3,7) -> Variante 2

Und was passiert wenn du folgende Einträge hast:
M(1,3) M(1,4) M(1,7)
M(2,3) M(2,4) M(2,7)
Nach deinem genannten Vorgehen würden dann (unter Annahme von Variante 1), für i = 1 die Zellen der Matrix beschrieben:
S(3,4) und S(4,7)
um anschließend von den Einträgen von i = 2 überschrieben zu werden?
Ich vermute mal, dass die wissen musst aus welchen Einträgen genau die Strecken berechnet wurden. Daher müsstest du vermutlich eine cell-Matrix erstellen in der für jedes i die zugehörige S-Matrix abgelegt wird. Alle nicht beschriebenen Felder in der Matrix haben dann allerdings einen 0-Eintrag.
Brauchst du nur die Strecken und es ist nicht wichtig aus welchen Einträgen sich diese ergibt, kann man das deutlich einfacher, in einer Matrix S(i,k) wobei k für die k-te Differenz steht, darstellen.

Und was heißt "nur dann wenn ein j definiert ist"? Gibt es eine Matrix / einen Vektor in dem die definierten Werte stehen oder meinst du damit einfach nur Matrix-Einträge die nicht 0 sind?
Und ist die Summe der j für alle i gleich oder variiert die Anzahl?

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
lgigu
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 07.08.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2018, 12:27     Titel:
  Antworten mit Zitat      
Hallo J0nas,

also der praktische Bezug besteht darin, dass ich Messkanäle i habe die durch verschiedene Punkte j gehen. Wenn Kanal 1 durch Punkt 3, 4 und 7 geht, brauche ich die Differenzen 34 47 und 37. Also Varante 2.

Da die Kanäle i nicht übereinander liegen, kommt es nicht vor, dass Messpunkte, wie du beschrieben hast, auftauchen werden.
Also kein
M(1,3) M(1,4)
M(2,3) M(2,4)

Meine Idee war bisher, dass größte i zu bestimmen, um die Anzahl der Kanäle zu kennen, und dann für jeden Kanal alle Differenzen zu bestimmen, Einträge mit 0 oder NAN dann anschließend löschen. Aber da habe ich noch probleme bei der umsetzung :/
Private Nachricht senden Benutzer-Profile anzeigen
 
J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 14.08.2018, 13:11     Titel:
  Antworten mit Zitat      
Hi,

auf die Anzahl der i's kommst du zum Beispiel mit:
Code:

n = length(find(M(:,1)>0))
 


Um alle Differenzen zu bilden hab' ich ein Beispiel gefunden und bisschen angepasst:
Code:

v = M(find(M(:,1)>0),1)

a(cumsum([1 n-1:-1:2])) = 1;
a = cumsum(a);
 
b = ones(1, (n-1)^2);
b((n-1):(n-1):(n-1)^2) = -n+3;
b = cumsum([2 b]);
b = b(b <= n);
 
differenz = v(a) - v(b);
 


Dadurch erhälst du einen Vektor mit allen Differenzen einer Zeile von M. Willst du das jetzt für alle i, also alle Zeilen machen, musst du das in eine Schleife packen.
Ist noch bisschen Bastelarbeit. Probier' mal aus ob du's hinbekommst. Bei Problem einfach melden, dann versuch ich dir zu helfen Wink

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable

Zuletzt bearbeitet von J0nas am 14.08.2018, 14:39, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
lgigu
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 07.08.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2018, 14:35     Titel:
  Antworten mit Zitat      
Okay, ich habs jetzt weniger schön und allgemeingültig, aber für mich als Anfänger übersichtlicher geschrieben Smile

Code:

%Anzahl der Messkanäle MK
MK = length(M(:,1)); %finde die Anzahl der Spalten

MKi=1; %Schleifenzähler
for MKi = 1:MK;
v=find(M(MKi,:)); %finde die Position in M von Werten größer 0
if length(v)==2 %für Messstrecken mit zwei Stützpunkten;
S(v(1),v(2))=abs(M(MKi,v(1))- M(MKi,v(2)));
elseif length(v)==3 %für Messstrecken mit drei Stützpunkten;
S(v(1),v(2))=abs(M(MKi,v(1))- M(MKi,v(2)));
S(v(2),v(3))=abs(M(MKi,v(2))- M(MKi,v(3)));
S(v(1),v(3))=abs(M(MKi,v(1))- M(MKi,v(3)));
end
MKi=MKi+1;
end;
 


Hast mir trotzdem geholfen, danke dir Smile
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 - 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.