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

messwerte_auffüllen/interpolieren

 

Chrislap
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2012, 14:38     Titel: messwerte_auffüllen/interpolieren
  Antworten mit Zitat      
hallo leute Smile
ich bin neu hier registriert, ich habe bei euch aber schon öfters nachgelesen und gestaunt wie hier für fast jedes problem immer eine lösung gefunden wird Smile
ich studiere vermessungswesen und bin noch keineswegs gut in matlap und so - wird sich aber hoffentlich mit der zeit ändern Smile

ich habe da ein ähnliches problem wie menschman und noch einige andere - leider konnte noch keine passende lösung finden - vllt suche ich aber auch nicht gut und erfahren genug Wink

also ich habe auch ne matrix mit 2 spalten - eine sozusagen zeit (eigentlich profilnummer, aber das kann man ja noch in die zeit umrechnen- da hatte es aber auch schon gehakt bei mir Very Happy ) und eine spalte mit den messwerten (abstand zum objekt).. das ist ne interessante sache - ich versuche mit einem hochfrequenten laserscanner, schwingungen festzustellen (ca. 60 herz).. allerdings sind einige profilnummern/zeiten doppelt mit verschiedenen messwerten und einige fehlen leider Sad für eine vernünftige fft (die zumindest schon funktioniert), brauche ich aber diskrete werte. ich müsste also die doppelten mitteln und die fehlenden interpolieren.. löschen von doppelten geht ja ganz einfach - aber ich bräuchte den mittelwert oder zumindest ne info, dass er immer den höheren oder kleineren wert nimmt..
so sieht das erstmal aus bei mir
Code:


I = importdata('1_2500.txt', '\t');
I(:,3) = [];                               % Höhe löschen, da sie hier nicht gebraucht wird
B = sortrows(I,[1 2])                   % sortieren nach profilnummer
B(:,2) = B(:,2) - mean(B(:,2));     % messwerte um den mittelwert
 
 B(:,1) = round(B(:,1)*10);        % profilnummer umdimensionieren bzw. runden
disp(num2str(B,'%7.4f'));           % anzahl kommastellen bekomme ich leider noch nicht seperat für die spalten hin^^

X = B(:,1);                                  % nu will ich ne neue matrix basteln
Y = B(:,2);
% for i=1 : max(X)                     hatte es mit schleife versucht - vergeblich, weils vorher schon hakt^^
Xi = (1:max(X));                         % X-Achse für Interpolation von 1 bis ende
Yi = interpl(X,Y,Xi) ;                     % lineare Interpolation
% end
Mi = [Xi Yi]                                 % die neue Matrix
 


das erste problem ist, dass er sagt, ich darf in inerpl kein double packen - ich weiß allerdings leider nicht wie man ne einzelne spalte in interger wandelt bzw weiß ich nicht obs daran lag - die messwerte müssen ja double bleiben, sonst ist es sinnfrei^^

wäre super wenn da mal jmd rüberguckt - ich kenne mich echt noch nicht aus und probiere hauptsächlig rum. denke mal da habe ich noch einige denkfehler - für jeden denkanstoß, wäre ich dankbar. wer sogar mal mein code reinkopieren möchte, kann auch nach der txt fragen Smile oder halt eine ähnlich generieren..
die sieht so aus (schon sortiert)

6277.0000 -0.0007
6278.0000 -0.0008
6280.0000 0.0074
6281.0000 -0.0100
6282.0000 -0.0048
6283.0000 -0.0035
6284.0000 0.0007
6284.0000 0.0024
6285.0000 -0.0139
6286.0000 -0.0033
6287.0000 -0.0069
6288.0000 -0.0008

geht natürlich bei 1,000 los, aber bei dem ausschnitt ist mal was doppelt und eine fehlt auch Smile bei einer frequenz von 60 profilen pro sekunde, könnte man es auch in die zeit umrechnen, aber denn gibs ja erstrecht doublewerte :S
und mir ist klar, dass bei so hochfrequenten vibrationen eine interpolation nicht gerade ideal ist, aber es geht halt darum, die ergebnisse der fft zu verbessern bzw zu gucken wie die sich verändert Smile

vielen lieben dank, chrisl Smile
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.07.2012, 19:08     Titel:
  Antworten mit Zitat      
Hallo,

bitte das Problem möglichst auf den Punkt bringen.

Zitat:
das erste problem ist, dass er sagt, ich darf in inerpl kein double packen

Was genau ist die Fehlermeldung? Es gibt weder eine Funktion inerpl noch eine Funktion interpl, sondern lediglich eine Funktion interp1 (Zahl eins statt Buchstabe l wie Ludwig).

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2012, 07:47     Titel:
  Antworten mit Zitat      
hi harald Smile
ok also das mit interp1 war wahrscheinlich ein tippfehler - ich gucke es mir nachher nochmal an, wenn ich matlab zur verfügung habe - ich hab allerdings rumprobiert und die fehlermeldung war iwie so: "no input arguments of type double in interp1"
allerdings war das nur mein rumprobiere zum füllen von lücken.. hätte ich wahrscheinlich erstmal weglassen sollen - damit verwirr ich nur Very Happy

mein problem auf den punkt gebracht:
ich habe einen datensatz mit doppelten und fehlenden messwerten. nun versuche ich die lücken mit interpolation zu füllen und die doppelten zu mitteln und sozusagen zu "verschmelzen" Smile
achja und wie man die erste spalte nach dem komma abschneidet, weiß ich leider auch noch nicht - das macht er iwie immer gleich für beide^^
gruß


edit: ja also mit interp1 sagt er: "The values of X should be distinct." ok - das war auf jedenfall schonmal ne kleine hilfe - das heißt ja eindeutig - also muss ich erst die doppelten rausnehmen - das kann ich provisorisch ja machen mit "unique", aber denn wird nix gemittelt - so kann ich sie nur einen zufallsmäßig rausnehmen. denn spinnt er zwar bei interp1 nicht mehr, aber er spuckte ne ganz komische matrix aus - voll mit werten, die da nix zu suchen haben :S
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.07.2012, 15:04     Titel:
  Antworten mit Zitat      
Hallo,

was das Mitteln der Werte angeht: das ließe sich z.B. so lösen:

Code:
x = [1 1.01 1.01 1.02]';
y = (1:4)';
xu = unique(x);
[~, loc] = ismember(x, xu)
yu = accumarray(loc, y, [], @mean)


Zitat:
aber er spuckte ne ganz komische matrix aus - voll mit werten, die da nix zu suchen haben :S

Meine Vermutung ist, dass du interp1 da nicht in der beabsichtigten Form verwendet hast. Da werden wir nur helfen können, wenn du den konkreten Aufruf inkl. Daten zur Verfügung stellst.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2012, 15:45     Titel:
  Antworten mit Zitat      
danke, auf jeden fall klasse wie hier versucht wird mir zu helfen Smile mein programmierwissen stammt hauptsächlig von turbopascal - das macht es für euch nicht leichter xD aber wenn das hier so weiter geht mit dazulernen, kann ich hier vllt auch mal jmd weiterhelfen Smile

deinen code da werde ich mir morgen mal genauer anschauen - da muss ich ja die matrix schon zerlegen - ich habe da immer leicht bauchschmerzen, dass das falsch wieder zugeordnet wird und ich alles zerschieße^^
bisher hatte ich das so gelöst - ich komme immer nur in kleinen schritten weiter Smile bin ja froh dass ich die fft zum laufen bekommen haben. eine .txt kann ich gerne dazupacken - geht das auch einfacher denke ich - muss sich keiner ne matrix basteln und brauch das nur durchrattern lassen. das ergebnis sieht leider immer nach so wenig arbeit aus, egal wieviel man sich den kopf zerbricht Very Happy

Code:

clear all
I = importdata('1_2500.txt', '\t');
I(:,3) = [];                                 % Höhe löschen, da sie hier nicht gebraucht wird
s = sortrows(I,[1 2])                   % sortieren
[A2_sort,ind]=unique(s(:,1))
B = s(ind,:)                                % doppelte Profilnummern löschen
B(:,2) = B(:,2) - mean(B(:,2));    % um den ´Mittelwert - nur so funzt fft
B(:,1) = round(B(:,1)*10);          % profilnummer umdimensionieren
disp(num2str(B,'%7.4f'));            % runden für weniger rechenaufwand

% X = B(:,1);
% Y = B(:,2);
% %for i=1 : max(X)
% Xi = (1:max(X));                     %X-Achse für Interpolation, von 1 bis zum maximal auftretenden Wert
% Yi = interp1(X,Y,Xi,'linear') ;     % zB lineare Interpolation
% %end
% Mi = [Xi Yi] % die neue Matrix
 
L = numel(B(:,1))        
poti = 2^nextpow2(L);                 % nächste 2er Potenz
fa= 50;                                       % Messfrequenz  
Y = fft(B(:,2),poti)/L;    
frequArea = fa/2*linspace(0,1,poti/2);

plot(frequArea,2*abs(Y(1:poti/2)))         % plot
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
 


so, das was nicht funktioniert, habe ich erstmal ausgeklammert. ich brauch nun einen zeitdiskreten datensatz, damit die fft vernünftige ergebnisse ausspuckt. danach kann ich mich um fenstern, darstellung, tiefpassfilter kümmern - das sind so die sachen die augenscheinlich noch notwendig sind erstma^^ bin da aber auch gerne für vorschläge offen - ich versuche halt das mögliche aus den daten rauszuholen - vorgaben oder so habe ich keine - wirklichen zeitnot auch nicht Smile

danke und gruß, chrisl

1_2500.txt
 Beschreibung:
ich habe da so alle 5m ein horizontalprofil - das ist bei 25m

Download
 Dateiname:  1_2500.txt
 Dateigröße:  354.29 KB
 Heruntergeladen:  683 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.07.2012, 21:44     Titel:
  Antworten mit Zitat      
Hallo,

wirf doch mal einen Blick in den Workspace. Die Anordnung von Mi ist nicht sehr sinnvoll. Besser wäre z.B.

Code:
Mi = [Xi; Yi]';


Wenn ich nun Mi mit B vergleiche, dann sieht das gut aus.
Was genau gefällt dir daran nicht?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2012, 10:33     Titel:
  Antworten mit Zitat      
hey harry,
danke das war der hinweis, der mir die augen geöffnet hat Very Happy ich hatte das zwar auch schon transponiert, aber ich kam nicht auf die idee, mir die neue Matrix im workspace anzugucken - hab mich zu sehr durchs commandwindow irritieren lassen Smile jetzt scheint alles ganz gut interpoliert zu sein, selbst das format stimmt^^
und dein ansatz mit dem mitteln von doppelten scheint auch gut zu funktionieren Smile
das heißt ich bin erstma rundum zufrieden und kann schauen wie ich weiter vorgehe Smile
aber vllt könntest du mir den gedankengang beim löschen nochmal kurz näher bringen. ich hab ungern nen code drin, den ich nicht ganz verstehe Very Happy

Code:

xu = unique(X);
[~, loc] = ismember(X, xu)
yu = accumarray(loc, Y, [], @mean)
 


unique ist ja klar aber was genau ist das da mit dem "[~,loc]" und dem befehl accumarray bzw deren input?
aber trotzdem genial - wer weiß ob und wann ich mal ohne gomatlab auf ne lösung gekommen wäre.
gruß, chrisl
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ISMEMBER sagt mir, ob die X-Werte in den XU-Werten vorkommen (das ist klar, deswegen mit ~ übersprungen) und wo.

ACCUMARRAY ist eine Funktion, bei der ich selbst gerne mal ins Schleudern komme. Schau dir doch die Dokumentation und die Beispiele darin an.
Code:


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.07.2012, 12:22     Titel:
  Antworten mit Zitat      
super danke, hast mir sehr geholfen.
vllt hätte ich meine nächste frage auch hier darlegen sollen, aber nu ist es in der skriptecke, weil ich da auf einen code bezug nehme. vllt hilft es denn später noch jmd anderen dort. oft hat man ja n ähnliches problem, aber haken tut es denn doch an der einen oder anderen stelle Smile
chrisl
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 - 2024 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.