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

Mittelwert einer Geschwindigkeitsmatrix über for schleife

 

Becks
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2010, 14:34     Titel: Mittelwert einer Geschwindigkeitsmatrix über for schleife
  Antworten mit Zitat      
Hallo.

Vorab möchte ich sagen, dass ich sehr wenig Erfahrung mit Matlab habe.

Ich habe in einem Experiment 1000 Bilder einer Strömung gemacht und diese Bilder wurden als .VC7 Dateien abgespeichert.
Die Dateien fangen mit "B00000.VC7" an und gehen bis "B01000.VC7".
Teilweise fehlen Bilder zwischendurch.

In diesen Dateien sind z.B. die Geschwindigkeiten in x-Richtung und y-Richtung in einer Geschwindigkeitsmatrix abgespeichert.

Über diese Funktion kann ich die Dateien einlesen:

Code:


function [u,w,X,Z] = read_2C(filename2c,Diameter);


%% 2C-Abschnitt 'vorne' einlesen und aufbereiten

%Datei einlesen
imx = readimx(filename2c);
zeilen = imx.Nx;
spalten = imx.Ny;

% Geschwindigkeitskomponenten u,w im experimentellen Kosy einlesen
ue = double(imx.Data(1:zeilen,1:spalten)) .* imx.ScaleI(1);
we = double(imx.Data(1:zeilen,spalten+1:(2*spalten))) .* imx.ScaleI(1);

% Achsen x, z im experimentellen Koordinatensystem einlesen
xe = ([1:zeilen]-0.5)*imx.Grid*imx.ScaleX(1)+imx.ScaleX(2);
ze = ([1:spalten]-0.5)*imx.Grid*imx.ScaleY(1)+imx.ScaleY(2);

% Ersetzten der 'Nullen' im Vektorfeld durch NaN (Not a Number)
indices = find((ue+we)==0);
ue(indices) = NaN;
we(indices) = NaN;

% Transponieren, damit Daten aussehen wie Davis-Daten (wenn in Matlab-Figure Axen
% 'reverse' gesetzt und damit gewünschtes KOS angezeigt wird)
ue = ue';
we = we';

%'Ränder' = 1. Spalte stromauf und letzte Spalte stromab abschneiden
index_links = min(find(max(~isnan(ue))==1));
index_rechts = max(find(max(~isnan(ue))==1));

ue(:,index_rechts) = NaN;
we(:,index_rechts) = NaN;
ue(:,index_links) = NaN;
we(:,index_links) = NaN;

% Koordinatentransformation experimentell (e) -> global
u = ue;
x = -xe;
w = -we; % Bei Geschwindigkeiten muss hier kein Vz-Wechsel hin, bei RMS wohl!
z = -ze;

% dimensionslos machen mit Durchmesser
X = x./Diameter;
Z = z./Diameter;


%% Interpolation auf gewünschtes x/y-Grid
% die Koordinaten aus den PIV-Aufnahmen sind "krumm", daher wird auf das
% vorgegebene X,Z-Grid interpoliert

%u = interp2(x,z,u,X,Z);
%w = interp2(x,z,w,X,Z);

end

 



Hiermit kann ich einzelne Dateien einlesen und graphisch darstellen:

Code:


function mittlereGeschwindigkeit


%% Definition der einzulesenden Dateien und Winkel

rho = 1.125;
U_inf = 70;

%Raketendurchmesser in [mm]
Diameter = 108;

%Dateiname der einzulesenden Datei
file = ('B00001.VC7');

%% Die Daten werden aus der Datei eingelesen (über Unterfunktion read_2C)

[u,w,X,Z] = read_2C(file,Diameter);

%Daten plotten

figure()

% root mean square der Geschwindigkeitskomponente u eintragen
imagesc(X,Z,u);
hold on

axis equal

title('Geschwindigkeitsschwankungen rms(u)')
xlabel('x/D[-]')
ylabel('z/D[-]')
colorbar

%Raketenheck einzeichnen
plot([-0.15,0,0,-0.15],[-0.5 -0.5,0.5,0.5],'LineWidth',1.5,'Color','r')

axis equal

end

 



Mir wurde

Code:


filename=strcat('B0000', num2str(i), '.VC7')

 


vorgegeben.

Da teilweise Bilder fehlen brauch ich ne if-schleife die dann weiter macht falls ein oder mehrere Bilder fehlen.

Wenn ich von i=1:10 laufen lasse sieht der letzte name so aus:

filename =B000010.VC7

sollte aber filename =B00010.VC7 so aussehen. Dafür bräuchte ich noch ne if-schleife.

Jetzt möchte ich die ganzen Geschwindigkeitsfelder aufsummieren und dann durch die entsprechende Anzahl teilen damit ich meine mittlere Geschwindigkeitssfeld bekomme und diese auch graphisch darstellen.

Kann mir dabei jemand helfen?

Bin über jede Hilfe dankbar.
Gruß, Becks.
Private Nachricht senden Benutzer-Profile anzeigen


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2010, 14:58     Titel:
  Antworten mit Zitat      
Zitat:
sollte aber filename =B00010.VC7 so aussehen. Dafür bräuchte ich noch ne if-schleife.


if schleift nix, das wird einmal ausgeführt und das war es dann mit dem if. Statt der Abfrage, ob i (schlechte Wahl für den Namen einer Variable, weil i*i = -1) nun größer ist als 9, 99, 999, 9999, ... könntest Du sprintf benutzen:
Code:
name = sprintf('B%05d.VC7', iCount);
Private Nachricht senden Benutzer-Profile anzeigen
 
Becks
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2010, 20:11     Titel:
  Antworten mit Zitat      
Danke schonmal für die Hilfe Epfi.
Werd mir den befehl nochmal in der Matlab Hilfe angucken und schauen wie ichs einbaue.

Hab mir nochmal ein paar threads über die sufu angeguckt.

Könnte ich hiermit starten?

Code:

for k=1:numel(Daten) % Beginn der for-Schleife die soviele Durchläufe hat, wie Datensätze vorhanden sind
 


Wie kann ich vorher nen Zielordner definieren wo meine ganzen Daten drin sind?
Ich müsste dann wohl noch definieren das er nur die '.VC7' Dateien nimmt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2010, 09:17     Titel:
  Antworten mit Zitat      
Um alle Dateien in einem Verzeichnis aufgelistet zu bekommen, gibt es den dir-Befehl. Den kannst Du auch nach bestimmten Dateiendungen oder Namen filtern lassen.
Private Nachricht senden Benutzer-Profile anzeigen
 
backspin
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 28.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2010, 13:57     Titel:
  Antworten mit Zitat      
Hallo,

Code:
filename=strcat('B0000', num2str(i), '.VC7')


Halte ich grundsätzlich für relativ ungeeignet, da man ja gerade bei Messergebnissen die meißt einzelnen files alle in einen Ordner packt und dann ausliest.
Also ich würde erstmal alle (relevanten) Dateien des Ordners einlesen - in etwa so:

Code:
directory='verzeichnisname\'
%relativ zum m-file oder komplette Pfadangabe

files=dir([directory '*.vc7']);
filenames=cellstr(char(files.name));
 


mfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Becks
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2010, 22:23     Titel:
  Antworten mit Zitat      
Hallo.

Vielen Dank schonmal für die Hilfe. Das hat mich schon etwas weitergebracht.

Ich habe die dateien mit

Code:


directory=uigetdir;
files=dir(fullfile(directory, '*.VC7'))

 


eingelesen.

Wozu brauch ich
Code:
filenames=cellstr(char(files.name));  
 
?

Jetzt speichert er die Dateien als (habe erstmal nur 10 genommen)

Code:


files =

10x1 struct array with fields:
    name
    date
    bytes
    isdir
    datenum

 



Es bringt mir ja nichts die Datei einfach so einzlesen zu mal ich dann ne Fehlermeldung kriege.

Ich möchte ja die Geschwindigkeitsfelder der Dateien aufaddieren und dann durch die Anzahl der eingelesenen Dateien teilen damit ich meine mittleres Geschwindigkeitsfeld bekomme.
Das geht soweit ich weiss über eine for-schleife.

Code:


for k=1:numel(Daten)  % Beginn der for-Schleife die soviele Durchläufe hat, wie Datensätze vorhanden sind  

 


Ist das der richtige Ansatz?

Kann mir jemand bei der schleife helfen?

Danke im vorraus.
Gruß, Becks.
Private Nachricht senden Benutzer-Profile anzeigen
 
Becks
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 24.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2010, 00:20     Titel:
  Antworten mit Zitat      
Hab noch etwas weiter getüftelt.

Beispiel für eine Datei:

Code:


file = 'B00001.VC7';
Daten = readimx(file);
uGeschwindigkeit = Daten.Data(1:Zeile, 1:Spalte)*Daten.ScaleI(1);
imagesc(Geschwindigkeit)

 


Wenn ich für Zeile und Spalte die richtigen Zahlen eingebe für meine Geschwindigkeitsmatrix dann bekomme ich mein Geschwindigkeitsfeld geplottet.


Beispiel für mehrere Dateien(8 Stück):

Code:


directory = uigetdir;
files = dir(fullfile(directory, '*.VC7'));

for k=1:8
cam=files(1:k, 1:1);
camneu(k)=readimx(cam(k).name);
end

 



So krieg ich die Dateien eingelesen und er speichert es unter camneu als 1x8 struct.

Jetzt möchte ich pro spalte mein geschwindigkeitsfeld auslesen:

Code:


for j=1:8
u=camneu(1:1, 1:j)
uneu=u(j).Data(22:64, 97:128)
end

 


Aber er speichert nur die letzte Matrix unter uneu.

Wie könnte ich die einzelnen Geschwindigkeitsfelder auslesen und addieren?

Wäre über Hilfe sehr dankbar.
Gruß, Becks.
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.