Verfasst am: 11.11.2009, 09:44
Titel: union und interp1
Ich möchte aus verschiedenen mit union Datenreihen zuerst eine fein X-Skalierung machen und dann mit Interpolation die Datenreihen gleich lang machen um dann den Mittelwert zu nehmen.
Leider macht mir der Befehl union ein kleinerer Vektor als die einzelnen gross sind und gibt dann mir beim Interpolieren ein entsprechender Fehler aus.
Code:
for i=1:(length(ScanVektor.Titel)-1)
Interpolation.Winkel=ScanVektor.Winkel(:,1);
Interpolation.Winkel{:,1}=union(Interpolation.Winkel{:,1},ScanVektor.Winkel{:,i+1});
i=i+1;
end
Interpolation.Moment{1}=interp1(ScanVektor.Winkel{1},ScanVektor.Moment{1},Interpolation.Winkel{1}) for m=1:length(ScanVektor.Titel)
Interpolation.Moment{m}=interp1(ScanVektor.Winkel{m},ScanVektor.Moment{m},Interpolation.Winkel{1});
m=m+1;
end
das liegt daran, dass in deinen Vektoren alle Elemente mehrfach vorkommen und mit union immer nur ein Wert einer Größe in den neuen Vektor aufgenommen wird.
Dieses Verhalten ist gewollt und auch dokumentiert.
Nun ja das stimmt.
Hast du mir ein Vorschlag, wie ich den Mittelwert aus diesen Vektoren trotzdem bekomme? Natürlich kann ich die Teilung nicht kleiner machen, wenn die Werte mehrmals vorkommen.
Das würde mich auch nicht stören. Doch ein Mittelwert-Vektor muss hin.
ich bin mir leider nicht sicher, ob ich richtig verstanden habe, was du tun möchtest. enn es Dir nur darum geht, den Mittelwert aus dem zusammengesetzten Vektor aus allen ScanVektor.Moment zu bekommen, kann man das z.B. auf diese Beiden Arten machen.
Code:
>> %Möglichkeit 1 tic
Zusammen = [];
for ind=1:length(ScanVektor.Moment)
Zusammen(end+1:end+length(ScanVektor.Moment{ind})) = ScanVektor.Moment{ind};
end mean(Zusammen) toc tic
%Möglichkeit 2
gesamtLaenge = 0;
mittelwert = 0;
for ind=1:length(ScanVektor.Moment)
gesamtLaenge = gesamtLaenge + length(ScanVektor.Moment{ind});
mittelwert = mittelwert + mean(ScanVektor.Moment{ind}*length(ScanVektor.Moment{ind}));
end
mittelwert/gesamtLaenge
toc
Wobei ich nicht sicher sagen kann, welche wirklich schneller ist. Denn bei 4 Versuchen war 3mal die zweite Variante schneller und einmal die zweite. Eigentlich sollte immer die Zweite schneller sein, da bei der ersten Variante Zusammen in der Schleife wächst. Naja, egal .
Danke für den Vorschlag läuft ganz gut. Jedoch möchte ich nicht einen Mittelwert sondern ein Mittelwertvektor. Die jeweiligen Vektoren sollen zu einem Mittelwertvektor zusammengefasst werden. Also die jeweiligen Mittelwerte der vershiedenen Messungen (Moment und Winkel). Habe mal veruscht, der mean Befehl nicht in der for Schleife elementweise auszuführen, sondern alsganzer Vektor. Doch leider hat das bis jetzt nicht geklappt.
ich verstehe dich leider immer noch nicht. könntest du mal ein Minimalbeispiel mir Ergebnis einstellen, dann kommen wir bestimmt zusammen auf eine Lösung.
Ich habe eine Struktur mit ScanVektor.Moment und ScanVektor.Winkel.
Das kann verglichen werden mit einer X-Y Daten-Kurve. In ScanVektor.Winkel{1} sind die x-Werte in ScanVektor.Moment{1} die y-Werte. In der struct sind mehrere Datenreihen also mehrere X-Y Daten-Kurven und daraus soll ein Mittelwert berechnet werden, damit ich nur noch ein ScanVektor.Moment und ScanVektor.Winkel Vektor habe, der den Mittelwert der Datenreihen darstellt. Also habe ich dann aus verschiedenen x-y Kurven nur noch eine Mittelwertkurve.
ScanVektor.Winkel{1} ScanVektor.Winkel{2} ScanVektor.Winkel{3} etc.
wird zu Mittelwert ScanVektor.Winkel
ScanVektor.Moment{1} ScanVektor.Moment{2} ScanVektor.Moment{3} etc.
wird zu Mittelwert ScanVektor.Moment
Ok ich versuche e snun auf eine andere Art.
Ich suche die Zeilen, bei denen der gleiche Wert enthalten ist wie in der vorangehender Zeile. Die Indexe der Zeilen schreibe ich in ein Vektor Kuerzungsvektor. Anschliessend möchte ich aus dem Interpolationsvektor.Winkel die in Kuerzungsvektor enthaltenen Zelladressen löschen. Leider scheint das auch nicht zu funktionieren.
Weiss jeman wieso?
Hier der Fehler
Error in ==> Hauptprogramm at 43
[MWMoment,MWWinkel]=MW_Messungen(ScanVektor,fileDaten);
??? A null assignment can have
only one non-colon index.
Error in ==> MW_Messungen at 19
Interpolation.Winkel{m}(Kuerzungsvektor{m}(i,1),1)=[];
Error in ==> Hauptprogramm at 43
[MWMoment,MWWinkel]=MW_Messungen(ScanVektor,fileDaten);
Code:
ifsize(ScanVektor.Titel,2)>1 for m=1:size(ScanVektor.Titel,2) for i=1:(length(ScanVektor.Winkel{m})-1)
if ScanVektor.Winkel{m}(i,1)==ScanVektor.Winkel{m}(i+1,1)
Kuerzungsvektor{m}(i,1)=i+1;
else end end
m=m+1;
end for m=1:size(ScanVektor.Titel,2)
Interpolation.Winkel{m}=ScanVektor.Winkel{m};
for i=1:(length(ScanVektor.Winkel{m}))
Interpolation.Winkel{m}(Kuerzungsvektor{m}(i,1),1)=[];
end
m=m+1;
end
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.