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

fehlende Werte interpolieren in Array

 

Belichter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2011, 11:14     Titel: fehlende Werte interpolieren in Array
  Antworten mit Zitat      
Hallo Expertengemeinde,
ich habe folgendes Problem:
Ich lese eine Log-Datei ein und erzeuge mir dabei ein Cell-Array mit einer Struktur wie im kleinen Screenshot zu sehen.

Ich würde gern die Lücken zwischen den gelesenen Werten linear interpolieren, habe das auch schon mit interp1 probiert, nur bekomme ich bei diesen Versuchen immer wieder die Fehlermeldung, dass die Längen von X und Y nicht übereinstimmen würden.
Ich hatte dabei die Spalten 2-7 jeweils als Y und Zeit als X verwendet.
Könntet ihr mir bitte weiterhelfen, wie man das richtig anwenden muss?

Viele Grüße
Lukas

beispiel.JPG
 Beschreibung:
Screenshot des Arrays

Download
 Dateiname:  beispiel.JPG
 Dateigröße:  39.79 KB
 Heruntergeladen:  1005 mal


MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2011, 12:03     Titel:
  Antworten mit Zitat      
vielleicht postet du nochmal den code, mit dem du diese Fehlermeldung erzeugst...

gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Belichter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2011, 12:35     Titel:
  Antworten mit Zitat      
Das Programm ist mittlerweile schon sehr groß. Und bis auf die Interpolation funktioniert soweit alles ganz gut.
Also ich habe am Ende ein Cell-Array "Ergebnis" und mit der Laufvariablen "k" geh ich dieses jetzt durch.

Beispielhaft für Spalte 2 versuchte ich zb. Folgendes:
Code:

Ergebnis{k,2} = interp1(Ergebnis{:,1},Ergebnis{:,2},Ergebnis{k,1});
 


Danke schon mal für das Interesse am Problem!

Lukas
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.08.2011, 14:09     Titel:
  Antworten mit Zitat      
Hallo,

dann verwende doch mal den Debugger und schaue dir
Code:
size(Ergebnis{:,1})
size(Ergebnis{:,2})

an.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Belichter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2011, 15:06     Titel:
  Antworten mit Zitat      
Mm, da das Array eine feste Größe hat, bin ich davon ausgegangen, dass die Spalten entsprechend die gleiche Länge haben sollten. Doch anscheinend liegt hier der Hund begraben.
mit
Code:

size(Ergebnis{:,1})
 

erhalte ich die Fehlermeldung.
??? Error using ==> size
Too many input arguments.

Ich weiß grad nicht weiter. Sad
 
Micha85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2011, 15:33     Titel:
  Antworten mit Zitat      
Hi,

wenn in den entsprechenden Spalten nur Zahlenwerte enthalten sind, probiers mal so:

Code:

size(cell2mat(Ergebnis(:,1)))
 


Übrigens, wie Harald schon erwähnt hat:
Der Debugger ist Dein Freund. Solche kleinen Missverständnisse und z.B. unterschiedliche Längen von Vektoren fallen bei einzelner Ausführung der Befehle sehr schnell auf.

Grüße
Micha
 
Belichter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2011, 15:52     Titel:
  Antworten mit Zitat      
Bekomme immernoch die Fehlermeldung, auch wenn ich

Code:

size(cell2mat(Ergebnis{2:end,1}))
 
verwende, da der Tabellenkopf aus Strings besteht.

Den Debugger benutze ich schon sehr häufig, nur war ich mir bei diesem Problem schon nicht sicher, ob ich die interp1 Funktion überhaupt richtig verstanden habe.
Sollte ich vielleicht erst alle Werte-Zeit-Paarungen in ein eigenes normales Array speichern, dort interp1 ausführen und erst zum Schluss alle Paarungen zusammenführen?

Gruß Lukas
 
Micha85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2011, 16:06     Titel:
  Antworten mit Zitat      
Hi,

bzgl. der Fehlermeldung:
Ich habe auch runde Klammer bei der Indizierung des Ergebnis-Arrays verwendet... Schau Dir mal die Unterschiede davon an:

Code:

Ergebnis(:,1)
Ergebnis{:,1}
 


Es hilft natürlich, wenn Du Funktionen wie interp1 zunächst an einfachen Beispielen testest und so den richtigen Funktionsaufruf lernst. Die Matlab Hilfe liefert hierzu ja meinst Beispiele.

Grüße
Micha
 
Belichter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2011, 16:22     Titel:
  Antworten mit Zitat      
Ok, vielen Dank! Damit geht dies schon mal.

Das Resultat :
1. Spalte (Zeitstempel) 11249 x 1
2. Spalte (Wert) 246 x 1

Also zählt er nur die Felder, wo wirklich etwas drin steht und die Längen sind damit nicht identisch.
Fällt euch vielleicht ein Workaround dazu ein?
Wie kann ich das Array strukturieren damit es funtioniert?


Gruß Lukas
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 24.08.2011, 17:45     Titel:
  Antworten mit Zitat      
Hier ein Bsp. für die Benutzung des Interp1 Befehls:

Code:

x = 1:1:10;
y = sort(rand(1,length(x)));
y_intp = interp1(x,y,[1:0.1:length(x)]);
 


Hier werden jetzt innerhalb der Werte von y(1) und y(10) 81 Werte interpoliert. Du hast aber vermutlich keinen Wert bei t=0 und t=ende und somit geht auch die Interpolation schief (liefert NaN), da sie nur innerhalb der Grenzen von y interpolieren kann. Außerhalb davon wäre eine Extrapolation.
Private Nachricht senden Benutzer-Profile anzeigen
 
Micha85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2011, 07:49     Titel:
  Antworten mit Zitat      
Hi,

so wie die beiden Vektoren (Zeitstempel und Wert) momentan aussehen kannst Du ja nichts mehr damit anfangen. Jegliche Zuordnung ist verschwunden.
Kannst Du eventuell zuvor an die leeren Stellen des Arrays einen bestimmten Wert oder vielleicht NaNs oder ähnliches reinschreiben. So hätten beide Vektoren die selbe Länge und Du könntest sie dann zu Weiterbearbeitung entsprechend kürzen. Wenn Du es also hinbekommst NaNs an die leeren Stellen des Wert-Vektors zu schreiben könnte das Kürzen so aussehen:

Code:

Zeitstempel = cell2mat(Ergebnis(:,1));
Werte = cell2mat(Ergebnis(:,2));
Zeitstempel(~isnan(Werte));
Werte(~isnan(Werte));
 


Wenn Du dann mit dem original Zeitstempelvektor in interp1 hast Du denke ich Dein erwünschtes Resultat:

Code:

Werte_interp = interp1(Zeitstempel, Werte, cell2mat(Ergebnis(:,1)));
 


Hoffe das hilft etwas.
Grüße
Micha
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 25.08.2011, 07:57     Titel:
  Antworten mit Zitat      
Hier bekommt er aber auch nur Werte innerhalb des Zeitstempel-Bereichs, der z.B. von 1 < t < 10 geht. Den Bereich 0 < t < 1 kann man mit interp nicht erstellen Wink.

Wenn man sich die Tabelle ansieht, sind hier ohnehin nur sehr wenige Messwerte vorhanden. Teilweise hat ja sogar der Zeitstempel lücken...von daher wird das Ergebnis von interp wohl mit Vorsicht zu genießen sein.
Private Nachricht senden Benutzer-Profile anzeigen
 
Micha85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2011, 08:05     Titel:
  Antworten mit Zitat      
@DSP

Hab mir die Tabelle nicht so genau angeschaut, aber Du hast natürlich vollkommen recht.
Die Ergebnisse der Interpolation zu interpretieren hätte er schon selbst machen müssen.

Frohes arbeiten. Grüße
Micha
 
Belichter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2011, 15:20     Titel:
  Antworten mit Zitat      
Habt vielen Dank!
So, wie Micha85 es beschrieben hat, habe ich es gemacht. Es funktioniert wunderbar. Es reicht, wenn die Funktion innerhalb des Zeitstempelbereichs interpoliert. Der Zeitstempel hat jedoch keine Lücken, ist nur ein Screenshot während des Debuggens gewesen...

Vielen Dank nochmal!

Gruß
Lukas
 
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.