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

Durchschnittswert-30%

 

susas
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.01.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 05.02.2010, 01:37     Titel: Durchschnittswert-30%
  Antworten mit Zitat      
Liebe MATLAB-Kenner,

mir als absolutem Anfänger stellt sich folgende Problematik:

- ich möchte ca. 1300 x- und y-Werte (Punkte) aus einer Textdatei in MATLAB einlesen

- die Durchschnittswerte jeweils aus allen x- und allen y-Werten soll daraus berechnet werden

- danach sollen alle Werte die diesen Durchschnittswert um 30 % unter- oder überschreiten gelöscht werden

- Textdatei mit den übriggebliebenen Werten soll ausgegeben werden

wie macht man das am besten?

nochmal: bin Anfänger also sorry für blöde Fragen

----) Textdatei im Anhang

1341Punkte.txt
 Beschreibung:

Download
 Dateiname:  1341Punkte.txt
 Dateigröße:  47.41 KB
 Heruntergeladen:  553 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

erste Hilfestellung:

1. fopen / textscan / fclose
2. m = mean(...)
3. mit 0.7*m und 1.3*m arbeiten. Soll, wenn x oder y-Wert ausserhalb des Bereichs liegen, das komplette Paar gelöscht werden, oder wie ist das gedacht?
4. fopen / fprintf / fclose

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
aj.geissler
Forum-Guru

Forum-Guru



Beiträge: 251
Anmeldedatum: 26.11.07
Wohnort: Seeheim-Jugenheim
Version: ---
     Beitrag Verfasst am: 05.02.2010, 10:40     Titel:
  Antworten mit Zitat      
Hi,

ich habe mir Deine Textdatei mal angeschaut.
Die Daten konnte ich schnell in MatLab mit Hilfe des load-Befehls laden, nachdem ich die erste Zeile löschte.

Wenn die Datendatei nicht verändert werden soll, musst Du mit fopen und anderen File-Handling-Befehlen arbeiten.

Weiterhin fiel mir auf, daß einige Datenpunkte exakt 0 waren. Diese Daten habe ich eliminiert.

Insgesamt habe ich folgenden Code ausgeführt:

Code:

load("c:/arbeiten/data.txt");     % Deine Datei habe ich unter diesem Namen abgespeichert
A=data;
ki=find(A(:,2)!=0 | A(:,3)!=0); % Datensätze, bei denen x und y exakt Null sind, werden entfernt
B=A(ki,:); % Die Matrix B enthält jetzt nur "relevante" Werte
MA=mean(mean(B(:,2:3)));  % Der Mittelwert der Gesamtheit aller x- und y-Werte wird berechnet.
ki=find(B(:,2)>=MA*0.7 & B(:,3)>=0.7); % Die Zeilenindices der Matrix werden bestimmt, bei denen sowohl die x- als auch y-Werte größer als Mittelwert - 30% sind.
C=B(ki,:);    % Die relevanten Werte werden extrahiert
 


Vielleicht hilft dies weiter ?
_________________

Andreas Geißler
Private Nachricht senden Benutzer-Profile anzeigen
 
susas
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.01.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 06.02.2010, 01:30     Titel: danke
  Antworten mit Zitat      
danke schon mal für eure schnellen anworten
muss s jetzt erst mal ausprobieren Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
susas
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.01.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 12.02.2010, 17:42     Titel:
  Antworten mit Zitat      
danke für den Vorschlag

wenn ich deinen Code im Matlab-Editor öffne, ergeben sich folgende Bugs:

- in der 1. Zeile:
Code:
load("c:/arbeiten/data.txt");

heisst das:
load('c:/arbeiten/data.txt') ?

- in der 3. Zeile:
Code:
ki=find(A(:,2)!=0 | A(:,3)!=0);

!= ist im Editor rot unterstrichen/wird nicht erkannt

- in der letzten Zeile:
Code:
C=B(ki,:);

C und ki sind hier rot unterstrichen/werden nicht erkannt

ansonsten
die Datendatei kann ruhig verändert werden

funktioniert das Ganze dann so:
im Matlab-Command-Window gebe ich
jede einzelne Zeile des Codes ein,
oder könnte ich die Code-Datei z.B. durchschnitt nennen,
im Command-Window dann nur diesen Namen eingeben
und den ganzen Code damit starten?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

AJ scheint nicht MATLAB, sondern eine MATLAB-ähnliche (?) Sprache zu verwenden.
!= muss in MATLAB ~= sein.
Das mit ' statt " hast du ja selbst schon erkannt.
Ansonsten sollte die Syntax richtig sein.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.01.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 13.02.2010, 00:12     Titel:
  Antworten mit Zitat      
Hallo,

das Script läuft jetzt

komischerweise sind die Werte nach dem load-Befehl
mit um 3 Stellen nach links verschobener Komma-Stelle geladen:


...

dagegen in der original data.txt-Datei:


...

------------------------------------------------------------------

mit
Code:
MA=mean(mean(B(:,2:3)))

wird der Mittelwert der Gesamtheit aller x- und y-Werte wird berechnet

hier wäre es besser, wenn jeweils ein Mittelwert für alle X-Werte
und einer für alle Y-Werte separat berechnet würde

wie macht man das denn?

------------------------------------------------------------------
mit
Code:
ki=find(B(:,2)>=MA*0.7 & B(:,3)>=0.7);
C=B(ki,:)

werden die Zeilenindices der Matrix bestimmt,
bei denen sowohl die x- als auch y-Werte grösser als Mittelwert - 30% sind,
die relevanten Werte werden extrahiert

hier wäre es besser wenn nur alle Werte,
(wie oben genannt: separat für X- und Y-Werte),
die -30% unter dem Mittelwert oder +30% über dem Mittelwert liegen
und alle, die genau dem Mittelwert entsprechen,
erhalten bleiben

Habt ihr da eine Lösung?

------------------------------------------------------------------
schöne Grüsse
Susa
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

die Daten müssen mit Faktor 1e3 multipliziert werden - steht ja auch drüber. Probier mal
Code:


getrennte Mittelwerte:
Code:


Ansonsten ist meine Empfehlung für heute erstmal, sich mit MATLAB und den bisherigen Vorschlägen auseinanderzusetzen. Das sollte eigtl weiterhelfen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.01.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 14.02.2010, 15:11     Titel:
  Antworten mit Zitat      
Hallo,

Harald, sehr herzlichen Dank für die Tipps!

so sieht s momentan aus:
Code:

load('c:/data.txt'); % Werte-Datei unter diesem Namen abgespeichert

format short g;

A=data;
 
ki=find(A(:,2)~=0 | A(:,3)~=0); % Datensaetze, bei denen x und y exakt Null sind, werden entfernt

B=A(ki,:); % Die Matrix B enthaelt jetzt nur "relevante" Werte

MA=mean(B(:,2:3)); % Ein Mittelwert der Gesamtheit aller x- Werte und ein Mittelwert der Gesamtwert aller y-Werte werden berechnet.

ki=find(B(:,2)>=MA*0.7 & B(:,3)>=0.7); % Die Zeilenindices der Matrix werden bestimmt, bei denen sowohl die x- als auch y-Werte groesser als Mittelwert - 30% sind.

ki=find(B(:,2)<=MA*1.3 & B(:,3)<=1.3); % Die Zeilenindices der Matrix werden bestimmt, bei denen sowohl die x- als auch y-Werte kleiner als Mittelwert + 30% sind.

ki=find(B(:,2)=MA*1 & B(:,3)=1);  % alle die genau dem Mittelwert entsprechen?

C=B(ki,:); % Die relevanten Werte werden extrahiert
 


habe nur noch ein ein paar kleine Unklarheiten bei diesem Teil:
Code:

ki=find(B(:,2)>=MA*0.7 & B(:,3)>=0.7); % Werte > Mittelwert - 30%
ki=find(B(:,2)<=MA*1.3 & B(:,3)<=1.3); % Werte < Mittelwert + 30%
ki=find(B(:,2)=MA*1 & B(:,3)=1); % Werte = Mittelwert
 


1.
gibt ja nun 2 Mittelwerte, einer für die x-Werte (Spalte 2) und einer für die y-Werte (Spalte 3)
x-Werte sollen sich natürlich auf den Mittelwert der x-Werte beziehen
und y-Werte auf den Mittelwert der y-Werte.
Kann man das irgendwie trennen?


2.
Werte > Mittelwert - 30%
Werte < Mittelwert + 30%
Werte = Mittelwert

also diese Werte sollen erhalten bleiben, die anderen gelöscht

ist das im Code korrekt, kann man das irgendwie zusammenfassen?

Schöne Grüsse
Susa
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Code:
MA=mean(B(:,2:3)); % Ein Mittelwert der Gesamtheit aller x- Werte und ein Mittelwert der Gesamtwert aller y-Werte werden berechnet.

Das bedeutet, MA(1) ist der Mittelwert von B(:,2) und MA(2) der von B(:,3).

Code:
ki=find(B(:,2)>=MA*0.7 & B(:,3)>=0.7); % Die Zeilenindices der Matrix werden bestimmt, bei denen sowohl die x- als auch y-Werte groesser als Mittelwert - 30% sind.

Vermutlich willst du aber
Code:
ki=find(B(:,2)>=MA(1)*0.7 & B(:,3)>=MA(2)*0.7);


Bei deinen Befehlen werden die ki immer überschrieben. Was du willst, ist vermutlich:
Code:
ki=find(B(:,2)>=MA(1)*0.7 & B(:,3)>=MA(2)*0.7 & B(:,2)<=MA(1)*1.3 & B(:,3)<=MA(2)*1.3);


Code:
C=B(ki,:); % Die relevanten Werte werden extrahiert

Wenn es nur darum geht, ist das find( ) im Befehl davor nicht nötig, es geht auch ohne. Stichwort: logische INdizierung.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.01.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 20.02.2010, 18:06     Titel:
  Antworten mit Zitat      
herzlichen Dank für die Antwort Harald,
die von dir angesprochenen Punkte habe ich inzwischen weitgehend gelöst

es gibt nur in der 7. Zeile Probleme:
entscheidend ist hier, dass nur eine der 4 Möglichkeiten zutreffen muss,
damit die ganze Zeile extrahiert werden soll

ich müsste hier also doch den Befehl "|" "oder" verwenden?

funtioniert aber nicht

so wie es jetzt geschrieben ist mit "&" wir eine Zeile ja dann extrahiert,
wenn alle 4 Bedingungen zutreffen

Code:
load('c:/data.txt');

format short g;

A=data;
 
ki=find(A(:,2)~=0 | A(:,3)~=0); % Datensaetze, bei denen x und y exakt Null sind, werden entfernt

B=A(ki,:); % Die Matrix B enthaelt jetzt nur "relevante" Werte

MA=mean(B(:,2:3)); % Ein Mittelwert(1) aller x- Werte und ein Mittelwert(2) aller y-Werte wird berechnet.
% MA(1) ist der Mittelwert von B(:,2) und MA(2) der von B(:,3)

ki=find(B(:,2)>=MA(1)*0.7 & B(:,2)<=MA(1)*1.3 & B(:,3)>=MA(2)*0.7 & B(:,3)<=MA(2)*1.3);
% Die Zeilenindices der Matrix werden bestimmt, bei denen eine der 4 Möglichkeiten zutrifft:
% - x-Wert grösser als 0.7*MA(1)
% - x-Wert kleiner als 1.3*MA(1)
% - y-Wert grösser als 0.7*MA(2)
% - y-Wert kleiner als 1.3*MA(2)

C=B(ki,:); % Die relevanten Werte werden extrahiert


Danke für deine Geduld
Susa Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

dann vermutlich so:
Code:
ki=find((B(:,2)>=MA(1)*0.7 & B(:,2)<=MA(1)*1.3) | (B(:,3)>=MA(2)*0.7 & B(:,3)<=MA(2)*1.3));


Die Bedingung >0.7 oder <1.3 wäre nämlich unsinnig, da sie von allen Zahlen erfüllt wird.

Grüße nach Berlin (wo ich übrigens erst war - warum werden bei euch keine Gehsteige geräumt?! Rolling Eyes)

Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
susas
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.01.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 20.02.2010, 18:52     Titel:
  Antworten mit Zitat      
das ist es! wieder was gelernt!

und das mit den ungeräumten Bürgersteigen
frag ich mich auch täglich!
sogar am Potsdamer Platz, wo zur Zeit noch die Berlinale stattfindet,
gibt es riesige Eisflächen.
Naja, mit den Berlinern kann man s ja machen (siehe S-Bahn)

wenigstens das Tauwetter arbeitet für uns...

Schöne Grüsse
wohin auch immer
Susa
Private Nachricht senden Benutzer-Profile anzeigen
 
susas
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 26.01.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 23.02.2010, 00:12     Titel:
  Antworten mit Zitat      
noch eine hoffentlich letzte Rückfrage:

warum werden meine eingelesen Werte so dargestellt?
(siehe Bild unten)
z.B.
Zeile 5: Punkt 5 341 1.6e+011 372 8.6e+011

original: Punkt 5 341,160000000000 372,860000000000

zwei Stellen nach dem Komma würden auch völlig ausreichen
- die Nullen könnten weg



schöne Grüsse
S
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Das Problem ist, dass "," hier als Dezimaltrennzeichen verwendet wird, aber als Spaltentrennzeichen erkannt wird. Hier eine kleine Funktion zur Vorverarbeitung, aufzurufen mit
Code:
replace_commas('data.txt')


Diese Funktion erzeugt eine data_mod.txt, in der alle Kommas durch Punkte ersetzt sind.

Code:
function replace_commas(file_name)

fid=fopen(file_name);
new_file = [file_name(1:end-4) '_MOD' file_name(end-3:end)];
fid2=fopen(new_file, 'w');
while 1
    tline = fgetl(fid);
    if ~ischar(tline),   break,   end
    tline = strrep(tline, ',', '.');
    fprintf(fid2, '%s\n', tline);
end
fclose(fid);
fclose(fid2);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.