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

nur bestimmte werte verwenden

 

ms1080
Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 02.12.09
Wohnort: ---
Version: R2009
     Beitrag Verfasst am: 23.02.2010, 19:56     Titel: nur bestimmte werte verwenden
  Antworten mit Zitat      
hi

ich bin wirklich ein blutiger neuling, was das programieren mit matlab betrifft, deswegen hoffe ich hier schnell hilfe zu bekommen. mein problem ist, dass ich eine txt-datei habe, in der viele werte stehen, ich aber eigenlich nur ein drittel der werte brauche. die datei ist folgendermaßen aufgebaut:

zeile 1-10 sind uninteressant und sollen weggelassen werden.
ab da sind dann werte in drei spalten untereinander aufgereit.
insgesammt sind es 1200 mal 250 zeilen.

interessant für mich ist jeweils nur die dritte spalte bzw. der dritte wert jeder zeile. diese werte brauche ich um daraus ein 3d bild zu plotten. wichtig ist dabei nur, das ich jedesmal nach 1200 werten eine neue spalte anfange, soll heißen, ich will eine matrix mit 250 spalten und 1200 zeilen erzeugen, die ich dann plotten will.

Frage 1: geht das überhaupt?
Frage 2: wie? ich wollte es mit einer for schleife machen, weiß aber nicht, wie ich dem programm sage, das es jedesmal nur den dritten wert der zeile einliest, und nach 1200 werten eine neue spalte aufmacht!

bitte um hilfe

hier mein aktueller fortschritt:

clear;
z=1;
n=1; %Anzahl der datein

%einlesen der Datei
fid = fopen('D:\bsp.txt');
rawdata = textscan(fid,'%f %f %f','headerlines',10); %Überschrift entfernen
fclose(fid);

%Matrix erzeugen
for z=1:1201
z=z+1;


end

die datei habe ich auch mit angehängt, schonmal danke für eure hilfe.

bsp.txt
 Beschreibung:

Download
 Dateiname:  bsp.txt
 Dateigröße:  4.02 MB
 Heruntergeladen:  1031 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: 23.02.2010, 20:03     Titel:
  Antworten mit Zitat      
Hallo,

überspringen von Daten mit *, z.B. %*f.

Die Daten sind dann ein langer Vektor. Den kann man mit reshape umwandeln, z.B.

Code:
data = reshape(data, 1200, 250)

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

Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 02.12.09
Wohnort: ---
Version: R2009
     Beitrag Verfasst am: 23.02.2010, 21:18     Titel:
  Antworten mit Zitat      
okay, danke

also dann ohne for schleife einlesen, richtig?

gruss ms
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, 22:17     Titel:
  Antworten mit Zitat      
Genau.

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

Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 02.12.09
Wohnort: ---
Version: R2009
     Beitrag Verfasst am: 24.02.2010, 09:31     Titel:
  Antworten mit Zitat      
also leider funktioniert das so nicht. matlab sagt mir:
??? Error using ==> reshape
To RESHAPE the number of elements must not
change.

Error in ==> Test at 10
data = reshape(data, 1200, 250);

was mach ich falsch?
Code:

clear;
z=1;
n=1;  %Anzahl der datein

%einlesen der Datei
fid = fopen('D:\bsp.txt');
    rawdata = textscan(fid,'%f %f %f','headerlines',10);   %Überschrift entfernen
    textscan(fid,'%f %f');
    data = [1200 250];
    data = reshape(data, 1200, 250);
fclose(fid);
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.02.2010, 10:53     Titel:
  Antworten mit Zitat      
Hallo

du machst irgend wie Blödsinn, du willst doch eingelesene Daten reshapen.
Warum machst du dann das?

Code:

    data = [1200 250];
    data = reshape(data, 1200, 250);
 


statt

Code:

    data = rawdata{3};
    data = reshape(data, 1200, 250);
 


und wozu dient noch diese Zeile?
Code:

textscan(fid,'%f %f');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
ms1080
Themenstarter

Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 02.12.09
Wohnort: ---
Version: R2009
     Beitrag Verfasst am: 24.02.2010, 11:07     Titel:
  Antworten mit Zitat      
ja okay war dumm von mir, also die textscanzeile kann natürlich weg

danke das mit der matrix funktioniert jetzt, wie gesagt bin blutiger anfänger bei matlab.

okay vielleicht könnt ihr mir ja jetzt noch ein wenig weiter helfen:

als 1. will ich nun den mittelwert bilden und ausgeben:
Code:

%Mittelwert erzeugen
MatrixMittel = mean(data);
 

richtig so? wie kann ich nun alle werte in der matrix, die genau 1 sind ausschließen, also nicht mit in die Berechnung des Mittelwertes einfließen lassen.

wollte das mit dem befehl
Code:
machen, aber ich bin bestimmt schonwieder viel zu blöd dazu.

sorry
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan*
Forum-Century

Forum-Century


Beiträge: 178
Anmeldedatum: 06.11.09
Wohnort: ---
Version: R2007b
     Beitrag Verfasst am: 24.02.2010, 11:27     Titel:
  Antworten mit Zitat      
Hi,

mit find folgendermaßen:

Code:
ind = find(MatrixMittel  == 1);
MatrixMittel (ind) = [];
 


eleganter geht es so:

Code:
MatrixMittel  = MatrixMittel(MatrixMittel ~=1);
 


Gruß Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.02.2010, 12:19     Titel:
  Antworten mit Zitat      
Hallo

bin mir unsicher, ob ich richtig verstanden habe, du willst doch Einsen in data ausschließen, oder?

Code:

data_for_mean = data
data_for_mean(data_for_mean==1)=0;
MatrixMittel= mean(data_for_mean)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan*
Forum-Century

Forum-Century


Beiträge: 178
Anmeldedatum: 06.11.09
Wohnort: ---
Version: R2007b
     Beitrag Verfasst am: 24.02.2010, 12:48     Titel:
  Antworten mit Zitat      
Hi,

hast du vermutlich vollkommen richtig verstanden, ich habe den Vektor schlichtweg falsch bennant.
Private Nachricht senden Benutzer-Profile anzeigen
 
ms1080
Themenstarter

Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 02.12.09
Wohnort: ---
Version: R2009
     Beitrag Verfasst am: 25.02.2010, 11:08     Titel:
  Antworten mit Zitat      
@ denny, danke für deine hilfe, aber leider funktioniert das so nicht ganz richtig, weil mein mittelwert viel zu klein ist.
kann es sein, das er bei dieser methode einfach alle werte die 0 1 sind nicht betrachtet, aber dann doch mit zur anzahl dre gesamten werte rechnet

mfg martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan*
Forum-Century

Forum-Century


Beiträge: 178
Anmeldedatum: 06.11.09
Wohnort: ---
Version: R2007b
     Beitrag Verfasst am: 25.02.2010, 11:18     Titel:
  Antworten mit Zitat      
Nein, tut 'er' nicht. Der Vektor wird gekürzt, entsprechend stimmt auch die Anzahl der Gesamtwerte.

Setz doch einfach mal ein paar Debugpunkte, und guck dir im Debugmodus genau an, mit welchen Vektoren gerechnet wird, und was evtl. schief läuft.

Gruß Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ms1080
Themenstarter

Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 02.12.09
Wohnort: ---
Version: R2009
     Beitrag Verfasst am: 25.02.2010, 12:16     Titel:
  Antworten mit Zitat      
Also hier gleich mal vielen danke für eure hilfe, habe das jetzt erstmal ganz gut hinbekommen soweit, vielen dank fürs erste

hier die Lösung:

Code:

clear;
z=0;       %Hilfsvariable
n=1;       %Anzahl der datein

%einlesen der Datei1

fid = fopen('D:\bsp.txt');
rawdata = textscan(fid,'%f %f %f','headerlines',8);       %Überschrift entfernen
data = rawdata{3};                                                    %nur die dritte Spalte einlesen
data = reshape(data,1200,250);                                  %1200x250 Matrix aus Vektor data erzeugen
fclose(fid);

%Mittelwert erzeugen

data_for_mean = data;                                              %Mittelwertmatrix definieren
ind = find(data_for_mean > 20000);                           %Aller Randwerte werden ausgeschlossen
data_B = data_for_mean(ind);                                   %Matrix B enthält jetzt nur noch relevante Werte
MatrixMittel= mean(mean(data_B));                           %Mittelwert bilden: 1. für jede Spalte, 2. für alle Spalten
fprintf('MatrixMittel %.4f \n ',MatrixMittel);                   %Ausgabe des Mittelwertes

%3D-Bild erzeugen

z=peaks(250);
mesh(data_for_mean);


nun will ich das alles noch grafisch darstellen, aber nur den oberen teil, für tipps bin ich immer offen

mfg martin
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.02.2010, 12:24     Titel:
  Antworten mit Zitat      
Hallo

ja das tut es, ich habe ja die Einsen nur durch Nullen ersetzt, Anzahl der Elemente hat dadurch in der Matrix nicht verändert.


Wenn du wirklich die Einträge nicht Zählen möchtest,
muss du wohl in der Schleife rechnen

Code:


MatrixMittel = arrayfun(@(x)mean(data(data(:,x)>1,x)),1:size(data,2))
 
Private Nachricht senden Benutzer-Profile anzeigen
 
ms1080
Themenstarter

Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 02.12.09
Wohnort: ---
Version: R2009
     Beitrag Verfasst am: 02.03.2010, 12:04     Titel:
  Antworten mit Zitat      
okay das funktioniert soweit, danke nochmals an alle die mir geholfen haben, nun will ich das alles ausgeben usw. als 3d bild.
hierbei sind aber wieder nur die größeren werte von interesse bzw sollen nur dargestellt werden.
könnt ihr mir da tipps dazu geben?
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.