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

Erstellung von Vektoren innerhalb einer Schleife

 

Waldemar
Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 17.10.2011, 18:10     Titel: Erstellung von Vektoren innerhalb einer Schleife
  Antworten mit Zitat      
Hallo zusammen,

mit meinem Programm möchte ich zum einen die z_position aus dem Namen der aktuellen Dateien ermitteln (die z_position wird für die Benennung der neuen Dateien gebraucht) und zum anderen (die Dateien enthalten letztenendes 4 Spalten a 39 Zeilen. Dabei entspricht die erste Spalte der Zeit, die Zweite der UNKALIBRIERTEN, gemittelten Geschwindigkeit, die Dritte der Standardabweichung und die Vierte der Anzahl, der zur Berechnung hinzugezogenen Geschwindigkeiten.) die Geschwindigkeit in der zweiten Spalte umzurechnen und schlussendlich eine neue Textdatei zu schreiben, die erneut die 1., 3. und die 4. Spalte besitzt plus dem modifizierten Geschwindigkeitsvektor!
(Noch ein Hinweis: Im Geschwindigkeitsvektor stehen neben positiven natürlichen Zahlen auch NaN falls keine Geschwindigkeit gemessen wurden.)

Textdateien sind folgendermaßen benannt:

vel_Buta300_y3_z200
vel_Buta300_y3_z-50
vel_Buta300_y3_z0

Das Skript:
Code:
t_error_ns=11.759;
t_error_s=t_error_ns*10^-9;
mess=47*10^-6;

list_all=dir;
list_all=list_all(~ismember({list_all.name},{'.','..'}));
dir_all={list_all.name};
length_list_all=length(list_all);
 
for i=1:length_list_all    
    dir_all_i=char(dir_all(i));
    length_dir_all_i=length(dir_all_i);    
    if length_dir_all_i==24        
        z_position=dir_all_i(16:20);        
    elseif length_dir_all_i==23
        z_position=dir_all_i(16:19);
    elseif length_dir_all_i==22
        z_position=dir_all_i(16:18);
    else
        z_position=dir_all_i(16:17);
    end

    [time vel rms number]=textread(list_all(i).name,'%f%f%f%f','delimiter','\t','headerlines',1);
    length_vel=length(vel);
     
    for j=1:length_vel
        if isnan(vel(j))
            vel_kal(j,1)=NaN;
        else
            vel_kal(j,1)=(mess/((mess/vel(j))+t_error_s));
        end
     end
   
    header = sprintf('%s\t%s\t%s\t%s', 'time', ['v_mean_kal_' dir_all_i(5:15) z_position],['v_std_' dir_all_i(5:15) z_position],['v_number_' dir_all_i(5:15) z_position]);
    filename=['X:\Spray\TMFB\Messtechniken\SA_Waldemar\Ergebnisse\kalibriert\' dir_all_i(1:15) z_position '.txt'];
   
    data=[time' vel_kal rms number]  % Hier ist der Fehler
    dlmwrite(filename, header, 'delimiter','', 'newline', 'pc');                
    dlmwrite(filename, data, 'delimiter','\t', 'newline', 'pc', '-append');  
end
 


Das Skript läuft wie gewünscht bis zur Zeile:
data=[time' vel_kal rms number]

Code:
??? Error using ==> horzcat
        CAT arguments dimensions are not consistent.


Daraufhin habe ich mir gedacht, die anderen Vektoren auch in der Schleife einzubauen damit alle Vektoren stets die gleiche Länge haben!

Also:
Code:

t_error_ns=11.759;
t_error_s=t_error_ns*10^-9;
mess=47*10^-6;

list_all=dir;
list_all=list_all(~ismember({list_all.name},{'.','..'}));
dir_all={list_all.name};
length_list_all=length(list_all);
 
for i=1:length_list_all    
    dir_all_i=char(dir_all(i));
    length_dir_all_i=length(dir_all_i);    
    if length_dir_all_i==24        
        z_position=dir_all_i(16:20);        
    elseif length_dir_all_i==23        
        z_position=dir_all_i(16:19);        
    elseif length_dir_all_i==22        
        z_position=dir_all_i(16:18);        
    else        
        z_position=dir_all_i(16:17);        
    end    
   
    [time vel rms number]=textread(list_all(i).name,'%f%f%f%f','delimiter','\t','headerlines',1);    
    length_vel=length(vel);    
   
    for j=1:length_vel  
        time_kal=time(j,1); % Zeile verändert
        rms_kal=rms(j,1); % Zeile verändert
        number_kal=number(j,1);  % Zeile verändert
        if isnan(vel(j))            
            vel_kal(j,1)=NaN;            
        else            
            vel_kal(j,1)=(mess/((mess/vel(j))+t_error_s));      
        end        
     end
       
    header = sprintf('%s\t%s\t%s\t%s', 'time', ['v_mean_kal_' dir_all_i(5:15) z_position],['v_std_' dir_all_i(5:15) z_position],['v_number_' dir_all_i(5:15) z_position]);
    filename=['X:\Spray\TMFB\Messtechniken\SA_Waldemar\Ergebnisse\kalibriert\' dir_all_i(1:15) z_position '.txt'];
   
    data=[time_kal' vel rms number]
    dlmwrite(filename, header, 'delimiter','', 'newline', 'pc');                
    dlmwrite(filename, data, 'delimiter','\t', 'newline', 'pc', '-append');  
   
end
 


Allerdings blieb der Fehler weil (so ist meine Vermutung) keine Vektoren geschrieben werden, wie eigentlich gewünscht) sondern nur der Wert der letzten Schleife gespeichert wird!

Ich weiss zwar nicht ob diese Idee überhaupt die richtige ist aber wie kriege ich es hin, dass time_kal, rms_kal und number_kal Vektoren werden also stets die gleiche Länge haben wie vel_kal damit kein Fehler entsteht?

Über Verbesserungsvorschlöge würde ich mich sehr freuen!!
Euer unerfahrener Waldi

_Peter_: Bitte Codeumgebung verwenden. Danke.
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.10.2011, 21:30     Titel: Re: Erstellung von Vektoren innerhalb einer Schleife
  Antworten mit Zitat      
Hallo Waldemar,

Dein Code ist fast nicht lesbar. Bitte benutze die CODE-Umgebung und auf keinen Fall glebe Schrift auf weißem Grund. Die normale Einrückung der Code-Zeilen wäre auch sehr hilfreich.

Du hast sehr viele Details erwähnt, die gar nichts mit dem Problem zutun haben. Ob die Zahlen Geschwindigkeiten oder Äpfel sind ist MATLAB egal. Das lenkt aber beim Lesen der Nachricht sehr ab.

Ich würde Dir raten, nur die Zeilen des Codes zu posten, die das Problem erzeugen und eine möglichst eindeutige Frage zu stellen. Vielleicht diese:
Code:

    [time, vel, rms, number] = textread(list_all(i).name, '%f%f%f%f', 'delimiter', '\t', 'headerlines', 1);
   
    length_vel=length(vel);    
    for j = 1:length_vel
       vel_kal(j,1)=(mess/((mess/vel(j))+t_error_s));
    end
    data = [time', vel_kal, rms, number];

Nun läßt sich "data" nicht erstellen wegen der gezeigten Fehlermeldung - woran liegt das?

Wenn dies das Problem ist, wäre der debugger eine große Hilfe:
Code:

Dann stoppt Matlab, wenn der Fehler auftritt und Du kannst z.B. im Command-Window die Dimensionen der 4 Variablen anschauen, ob sie in der gedachten Weise zusammen passen.

Nebenbei: Die FOR-Schleife ließe sich so einfacher ausdrücken:
Code:
vel_kal = mess ./ (mess ./ vel + t_error_s);

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 19.10.2011, 11:42     Titel:
  Antworten mit Zitat      
Hallo Jan,

deine Kritik ist absolut berechtigt.

Ich probiere es mal anders:

ich möchte mit meinem Porgramm die z_position jeder Datei, die im aktuellen Verzeichnis ist, ermitteln und darauffolgend eine Vektor erstellen, der alle z_positionen speichert!
aber irgendwie kriege ich nicht die richtige Syntax für den Vektor (rot markiert) erstellt!

Mein Programm:


list_all=dir;
list_all=list_all(~ismember({list_all.name},{'.','..'}));
dir_all={list_all.name};
length_list_all=length(list_all);

%%
for i=1:length_list_all

dir_all_i=char(dir_all(i));
length_dir_all_i=length(dir_all_i);

if length_dir_all_i==24

z_position=dir_all_i(16:20);

elseif length_dir_all_i==23

z_position=dir_all_i(16:19);

elseif length_dir_all_i==22

z_position=dir_all_i(16:18);

else

z_position=dir_all_i(16:17);

end


z_position_all=[z_position(i),1];

end

Also ich möchte einen Vektor mit einer Spalte und je Zeile soll die je Schleifendurchlauf berechnete z_position eingetragen werden!

Allerdings kommt in der rot markierten Zeile ein Fehler vor!

Ich bitte um Hilfe!

MfG,

Waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 19.10.2011, 13:45     Titel:
  Antworten mit Zitat      
Hallo zusammen,

ich habe es nochmal mit einem Ratschlag von Harald probiert (die entsprechenden Zeilen sind auskommentiert)
mittlerweile wird ein Vektor erstellt, bei dem sich auch je Zeilendurchlauf ein Null gegen eine andere Zahl austauscht!

Allerdings sollten ja in den Vektor die z_position eingetragen werden!
1. Problem!

z_position: Eintrag im Vektor:

z-100 -------------- 122
z-125 -------------- 45
z-150 -------------- 49
z-175 -------------- 55
z-200 -------------- 48

2. Problem!
bei der z_position z-225 gibt es dann den Fehler:

Attempted to access z_position(6); index out of bounds because
numel(z_position)=5.


Irgendwie komme ich nicht weiter!

Mein aktuelles Skript:

Code:
list_all=dir;
list_all=list_all(~ismember({list_all.name},{'.','..'}));
dir_all={list_all.name};
length_list_all=length(list_all);
z_position_all=zeros(length_list_all,1);
%%
for i=1:length_list_all
   
    dir_all_i=char(dir_all(i));
    length_dir_all_i=length(dir_all_i);
   
    if length_dir_all_i==24
       
        z_position=dir_all_i(16:20);
       
    elseif length_dir_all_i==23
       
        z_position=dir_all_i(16:19);
       
    elseif length_dir_all_i==22
       
        z_position=dir_all_i(16:18);
       
    else
       
        z_position=dir_all_i(16:17);
       
    end
   
    %M = zeros(m, n);
    %for I = 1:m
    %M(I,:) = ......;
    %end
   
   
    z_position_all(i,:)=z_position(i);
   
   
   
   
end


Hätte vielleicht jemand eine Idee!?
(Das Skript läuft bis z_position_all(i,:)=z_position(i); wie gewünscht!)
Wäre sehr dankbar.

MfG,

Waldi
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.10.2011, 15:13     Titel:
  Antworten mit Zitat      
Hallo Waldemar,

Du versuchst eine Zahl aus den Datei-Namen zu extrahieren, Datei-Namen sind aber Strings. Das ist ein Unterschied.
Code:
String = '55';
Number = 55;

Ersteres ist ein Vektor der Dimension [1 x 2] vom Typ CHAR (also zwei Buchstaben hintereinander), zweiteres ist ein scalarer DOUBLE.

In Deinem Code wird z.B. "z_position = dir_all_i(16:17)" gesetzt. Danach kann "z_position" der String '55' sein. "z_position(i)" ist dann der i.te Buchstabe davon. Und da Du den in ein DOUBLE-Array schreibst, wird der ASCII-Wert des Buchstaben genommen:
Code:
double('5')  % >> 53


U.a. SSCANF und SPRINTF wandeln zwischen Strings und Zahlen um.

Code:
list_all = dir;
dir_all = {list_all.name};
dir_all(strncmp(dir_all, '.', 1)) = [];
length_list_all = length(dir_all);
z_position_all = zeros(length_list_all, 1);

for i = 1:length_list_all
   dir_all_i = dir_all{i};   % Much faster than CHAR(dir_all(i))
   index = strfind(dir_all_i, '_z');
   z_position_all(i) = sscanf(dir_all_i(index + 2:end), '%d', 1);
end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 25.10.2011, 15:33     Titel:
  Antworten mit Zitat      
hallo zusammen,
hallo jan,

kam erst heute dazu deine hilfe anzuwenden!
...sie hat prima geklappt!

danke sehr.
_________________

Im "ich brauch Hilfe"-Status
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.