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

Variable Interpolation

 

Findus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2016, 01:28     Titel: Variable Interpolation
  Antworten mit Zitat      
Grüß euch,

mittlerweile bin ich mit meinen Matlab-Erstanwender-Kenntnissen so ziemlich am Ende, deswegen hoffe ich, dass mir hier einer weiterhelfen kann.

Ich habe verschiedene Vektoren, die an versch. Stellen in unbest. Menge Nullstellen besitzen, z.B.:
a = [1;0;5;6;7;0;0;0;0;2;0]
Dabei kann es sein, dass die Nullstellen am Anfang oder Ende stehen, einzeln vorkommen oder in größerer Menge.

Ich möchte nun die Nullstellen durch Interpolation ersetzen. Und sollte eine Nullstelle am Anfang oder Ende stehen, diese einfach abschneiden. Am Beispiel von a:
a = [1;3;5;6;7;4,5;2].

Jetzt habe ich aber nicht nur einen Vektor, sondern messbedingt mind. über 100 Vektoren mit je 130.000 Stellen. Daher denke ich, dass eine Einlesschleife am sinnvollsten wäre.
Ich komme aber auf keinen grünen Zweig, wie ich so eine flexible Suche in der Schleife programmieren könnte.

Hat einer vllt. eine Idee?

Wäre sehr cool, wenn sich jemand findet. Danke!

PS: Falls sich einer fragt warum: Die Vektoren sind Messungen. Und die Software setzt immer Nullen, wenn der zulässige Bereich überschritten wird. Deswegen muss ich die Nullen für die weitere Auswertung "rausschmeißen"


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 09.03.2016, 02:32     Titel:
  Antworten mit Zitat      
find sollte helfen.
Zitat:
Ich komme aber auf keinen grünen Zweig, wie ich so eine flexible Suche in der Schleife programmieren könnte.

was hast du denn versucht bis jetzt? welche fehler sind dabei aufgetreten?
sihe dazu auch den thread aus meiner signatur
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Findus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2016, 10:15     Titel:
  Antworten mit Zitat      
Dank dir für deine Antwort. Mit dem "find"-Befehl komme ich natülich klar.
Unten ist mein Bsp. für den angepassten Vektor a.

Ich scheitere jetzt aber darin für folgende Fälle:
- wenn nicht nur eine 0 auftritt, sondern mehrere 0 nacheinander
- wenn am Anfang/Ende eine 0/mehrere 0 auftreten, soll er abschneiden

Code:

clear all

%a = [1;0;5;6;7;0;0;0;0;2;0]
a = [1;0;5;6;7;0;2]

a_0 = find(a==0)

for m=1:length(a_0)
 
 NS_u = a(a_0(m)-1)
 NS_o = a(a_0(m)+1)
 
 if NS_u < NS_o
     NS_interpol(m) = (NS_o - NS_u)/2 + NS_u
 end
 
  if NS_u > NS_o
     NS_interpol(m) = (NS_u - NS_o)/2 + NS_o
  end

   if NS_u == NS_o
      NS_interpol(m) = NS_u
   end
 
 a(a_0(m))=NS_interpol(m)
 
end

 


Danke!
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 09.03.2016, 10:48     Titel:
  Antworten mit Zitat      
sowas?
Code:
a = [1;0;5;6;7;0;0;0;0;2;0] ;
a(1:find(a~=0,1)-1)=[];
a(find(a~=0,1,'last')+1:end)=[];
a2=interp1(find(a~=0),a(a~=0),1:numel(a));

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Findus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.03.2016, 13:56     Titel:
  Antworten mit Zitat      
Hallo Winkow,

das wegschneiden am Ende und Anfang des Vektors klappt schon mal super! Und das alles spart mir eine Schleife, perfekt :)

Ziel ist eigentlich, dass der Code so funktioniert:
a = [1;0;5;6;7;0;0;0;0;2;0];

1) Wegschneiden der Nullen am Anfang/Ende:
a = [1;0;5;6;7;0;0;0;0;2];

2) Reduzierung der mehrmals vorkommenden Nullen auf eine Null:
a = [1;0;5;6;7;0;2];

3) Ersetzen der einzelnen Nullen durch Interpolation.
a = [1;3;5;6;7;4,5;2];

Wie kann ich Schritt zwei noch umsetzen?
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 09.03.2016, 14:14     Titel:
  Antworten mit Zitat      
Code:
a = [1;0;5;6;7;0;0;0;0;2;0] ;
a(1:find(a~=0,1)-1)=[];
a(find(a~=0,1,'last')+1:end)=[];
[a2,~]=RunLength(a);
a3=interp1(find(a2~=0),a2(a2~=0),1:numel(a2));

man kann auch mit diff und find arbeiten um die mehreren nullen zu finden aber mit runlength aus dem fex is das fixer.
http://www.mathworks.com/matlabcent.....eexchange/41813-runlength
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Findus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.03.2016, 00:31     Titel:
  Antworten mit Zitat      
Perfekt, vielen Dank!

Je länger ich darüber nachdenke, favorisiere ich doch deine erste Antwort. Denn wenn ich drei Geschwindigkeitsvektoren habe, und nur einer hat die Nullen, dann bleiben die anderen Geschwindigkeitsvektoren unberührt.
 
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.