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

Mehrere Y-Werte zu einem X-Wert - Problem

 

Julian0989

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2015, 21:05     Titel: Mehrere Y-Werte zu einem X-Wert - Problem
  Antworten mit Zitat      
Hallo,

habe folgendes Problem. Ich habe eine Datenreihe mit mehreren Y-Werten zu einem X-Wert. Ich würde nun gerne über ein Skript die Y-Werte raussuchen und den Mittelwert bilden und anschließend den Mittelwert zu dem entsprechenden X-Wert speichern lassen. Folgendes hab ich mir dazu bisher überlegt:



Code:
h = 1;
i = 1;
j = 1;
y = yy(:,1); %einlesen der Y-Werte
x = 0;
z = 1;

while z>100
   
    if y(i)== z

        h = h + yy(i,2);
        i = i+1;
        j = j+1;
       
    else

        x = h/j; %Mittelwert bilden
        ausgabe = [i,x];
        z = z+0.05;
        j = 0;
       
    end
end
 



Ich weiß nicht genau, ob mein Gedankengang nachvollziehbar ist. Wäre über Hilfe sehr dankbar. Gibt es vielleicht auch einen einfachereren Weg?

Vielen Dank schonmal!
edit winkow: bitte code umgebung benutzen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 08.06.2015, 21:25     Titel:
  Antworten mit Zitat      
für mich ist das so noch nicht nachvollziehbar. das ist ja nicht lauffähig. für den mittelwert kann man
Code:
benutzen
beispieldaten und ein lauffähiges beispiel wären hilfreich.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Julian0989

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2015, 21:44     Titel:
  Antworten mit Zitat      
Code:
% Das ist mein Programm.

29,2500000000000   3,56372549019608
29,2500000000000   3,56372549019608
29,2500000000000   3,56862745098039
36,6000000000000   3,60784313725490
36,6000000000000   3,60784313725490
36,6000000000000   3,61029411764706
36,6000000000000   3,61029411764706
39,1500000000000   3,56372549019608
39,1500000000000   3,56372549019608
39,1500000000000   3,56879219855546
39,1500000000000   3,56879291387183
39,1500000000000   3,56879391531473
45,1000000000000   3,60049019607843
45,1000000000000   3,60294117647059
51,5500000000000   3,62500000000000
51,5500000000000   3,62500000000000
51,5500000000000   3,62745098039216
51,5500000000000   3,62807075091869
51,5500000000000   3,62927203276558
51,5500000000000   3,62990196078431
59,7500000000000   3,64271488536674
59,7500000000000   3,64413156429764
59,7500000000000   3,64516581243615
59,7500000000000   3,64658249136705
59,7500000000000   3,64705882352941
71,9000000000000   3,82598039215686
71,9000000000000   3,82598039215686
71,9000000000000   3,82598039215686
71,9000000000000   3,82598039215686
71,9000000000000   3,82843137254902
71,9000000000000   3,82843137254902
75   3,80392156862745
75   3,80392156862745
75   3,80637254901961
88   3,90779943025659
88   3,90837524906122
88   3,90931372549020
88   3,90931372549020
 


Mit der if-else Bedingung möchte ich, dass entweder der aktuelle Y-Wert genommen wird und auf h addiert wird, oder falls ein neuer X-Wert kommt, er h durch die Anzahl der vorher aufsummierten Werte teilt (Mittelwert bildet).
Das ganze funktioniert nicht so wie es soll und ich dachte ich frage hier mal, vielleicht gibt es einen einfachereren Weg aus mehreren Y-Werten zu einem X Wert einen Y-Wert zu machen.

Freundliche Grüße.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 08.06.2015, 22:20     Titel:
  Antworten mit Zitat      
das siht nicht nach einem programm aus .. außerdem wird in matlab ein punkt als dezimaltrennzeichen verwendet.
wenn es nicht zu viele daten sind sollte das recht leicht mit unique und einer forschleife realisirbar sein.
Code:
A=randi(50,100,2)
B=unique(A(:,1))
for k=1:numel(B)
C=mean(A(:,1)==B(k),2)
end
bei zu vielen daten sollte mans ich dann nochmal gedanken machen Wink
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Julian0989

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2015, 23:08     Titel: Rom
  Antworten mit Zitat      
Super, Vielen Dank erstmal für deine Hilfe.
Leider sind es ~800.000 Datenpunkte.

Code:

C=mean(A(:,1)==B(k),2)
 


Was genau meintest du mit dieser Zeile?
Also das in C ein Mittelwert abgespeichert wird, verstehe ich noch.
Auch das von A auf die erste Spalte zugegriffen wird. (Bei B auf die 2. Spalte? B besteht ja nur aus einer...)
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 08.06.2015, 23:30     Titel:
  Antworten mit Zitat      
ja da hat sich auf die schnelle der fehlerteufel eingeschlichen. hatte kein matlab da.. mit 800k werten meinst du damit 800k einzigaritge werte oder sind es dann nur 10000 eizigarite etc. das macht ja unterschied

Code:
A=randi(40000,50000,2) ;
B=unique(A(:,1)) ;
C=nan(size(B));
for k=1:numel(B)
C(k)=mean(A(A(:,1)==B(k),2));
end
 

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 09.06.2015, 11:28     Titel:
  Antworten mit Zitat      
Hallo,

das ist ein bekanntes Problem. Effektiv ist sowas mit accumarray zu lösen, detailliert erklärte Beispiele von mir findest du
hier http://www.gomatlab.de/benachbarte-.....-einem-vektor-t34850.html
oder hier: http://www.gomatlab.de/vektor-durch.....-werte-finden-t35245.html

VG,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobolf
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 13.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2015, 16:13     Titel:
  Antworten mit Zitat      
Danke! Das ist genau das was ich suche. Allerdings klappt bei mir irgendetwas noch nicht so richtig..

Code:

load('C:\Users\x\Desktop\yy')  %800000x2 double

t = yy(:,1);
Data = yy(:,2);

% unique t-Werte und die Indizes, an denen sie auftreten
[t_unique,~,idx] = unique(t);

% Anhand der Indizes die Daten in Data akkumulieren und @mean drauf anwenden
D_mean =  accumarray(idx', Data',[],@mean);

 


Beim Ausführen kommt folgende Fehlermeldung:

Error using accumarray
Second input VAL must be a vector with
one element for each row in SUBS, or a
scalar.

Error in MeanSOC2 (line 12)
D_mean = accumarray(idx',Data',[],@mean);

Kannst du mir sagen wo mein Fehler liegt?

Grüße,
Tobolf
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 13.06.2015, 18:18     Titel:
  Antworten mit Zitat      
Hallo,

ich würde vermuten, die Apostrophe müssen weg (accumarray frisst Spaltenvektoren, du hast bereits Spaltenvektoren und machst sie wieder zu Zeilenvektoren).

VG,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Tobolf
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 13.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2015, 00:36     Titel:
  Antworten mit Zitat      
Super, jetzt klappt alles.

Habe nun eine andere Frage. Ich möchte gerne eine Art Ausgleichsfunktion durch die Werte legen. Die ersten Werte müssen mit einer e-Funktion, die späteren Werte mit einer Funktion 3. Grades interpoliert werden. Ich kenne nur die Funktion polyfit und polyval.
Code:

p = polyfit(A(:,1),A(:,2),3);
y = polyval(p,A(:,1));
 


Im Anhang hab ich die Kennlinie hochgeladen in der die blaue Funktion mit dem Code als Polynom 3. Grades interpoliert wurde. Am Anfang passt das ganze allerdings überhaupt nicht.
Gibt es eine spline-ähnliche Funktion mit der sich das bewerkstelligen lässt?
Die Funktion 'spline' in Matlab hab ich schon gefunden, allerdings verstehe ich die Erklärungen in der Matlab-Hilfe nicht.
Hoffe ihr könnt weiter helfen Smile

Grüße,
Tobolf

Kennlinie.fig
 Beschreibung:

Download
 Dateiname:  Kennlinie.fig
 Dateigröße:  15.87 KB
 Heruntergeladen:  365 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 14.06.2015, 15:14     Titel:
  Antworten mit Zitat      
Hallo,

mach dafür am besten ein neues Thema auf und zeige, was du bereits versucht hast. Das Problem ist nicht so einfach zu lösen -- soll das stetig ineinander übergehen? Wo ist die Grenze (bis wann soll mit einer Exponentialfunktion und ab wann soll mit einem Polynom gefitted werden)?

Ein kurzer Blick auf die Daten: Für den Anfangsbereich sind doch sowieso nur 2 Datenpunkte vorhanden, stimmt das? Da ist es sowieso fragwürdig, eine Exponentialfunktion durchzulegen.
Trotzdem: versuch doch für den hinteren Teil einfach mal sowas
Code:
threshold = 1;
mask = A(:,1) > threshold;
p = polyfit(A(mask,1),A(mask,2),3);
y = polyval(p,A(mask,1));  % alternativ am vorderen Teil auch das Polynom anwenden: y = polyval(p,A(:,1));

Das hilft, um die Grenze threshold zu finden. Hier würde ich es mal mit 1 als Grenze versuchen, dann sollte der Fit für den hinteren Teil schon mal besser aussehen.

VG,
Nras.
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 - 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.