hallo leute
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
ich studiere vermessungswesen und bin noch keineswegs gut in matlap und so - wird sich aber hoffentlich mit der zeit ändern
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
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 ) 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 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,[12])% 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 oder halt eine ähnlich generieren..
die sieht so aus (schon sortiert)
geht natürlich bei 1,000 los, aber bei dem ausschnitt ist mal was doppelt und eine fehlt auch 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
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).
hi harald
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
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"
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
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.
danke, auf jeden fall klasse wie hier versucht wird mir zu helfen 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
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 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
Code:
clearall
I = importdata('1_2500.txt', '\t');
I(:,3) = []; % Höhe löschen, da sie hier nicht gebraucht wird
s = sortrows(I,[12])% 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
danke und gruß, chrisl
1_2500.txt
Beschreibung:
ich habe da so alle 5m ein horizontalprofil - das ist bei 25m
hey harry,
danke das war der hinweis, der mir die augen geöffnet hat 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 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
das heißt ich bin erstma rundum zufrieden und kann schauen wie ich weiter vorgehe
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
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
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
chrisl
Einstellungen und Berechtigungen
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.