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

NC Datei splitten und speichern

 

medicus007
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 05.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2012, 16:20     Titel: NC Datei splitten und speichern
  Antworten mit Zitat      
Hallo zusammen,

Mein Problem ist folgendes:
Ich schreibe eine BA - Arbeit. Ich hab NS-DAten für ein hydrologisches Modell bekommen. Ich muss die Daten so adaptieren dass das Modell die Daten "erkennt". Ich bin kein Matlab Profi und brauche bitte etwas Hilfe.
Ich habe rel. große nc Dateien, die ich auf meinem Rechner nicht auf einmal einlesen kann. Jetzt lese ich sie eben einzeln ein. Danach möcht ich sie als Textdatei speichern. So weit so gut.
Frage 1:
Mit dem save Befehl kommen beispielsweise die e009 Angaben hinzu. Die fprintf Version wäre besser, da könnte ich auch runden (mache ich auch bei der Projektion weiter unter im Code), aber da brauche ich anscheinend eine Schleife (dauert zu lange)
Frage 2:
Die Daten liegen in einem 1*1 km Raster vor und ich möchte sie auf 5*5km interpolieren, ist es sinnvoll diese Interpolation vor der Textschreiberei einzubauen?

Alte Versuche hab ich mit % versehen

Hier mein Code:
Code:
function INCA_Interpol

% ---> NC TOOLBOX MUSS INSTALLIERT UND EINGESCHALTEN SEIN
% ---> MANUELL ERLEDIGEN

run C:\Users\Walter\Documents\MATLAB\nctoolbox\setup_nctoolbox.m;

% Ordner der Dateien angeben, ersten 2 Einträge sind nicht zu
% gebrauchen

listing = dir('C:\Users\Walter\Documents\MATLAB\INCA\Hourly\');
listing(1:2)=[];

% Checkfile Anfangsbuchstaben beachten, nimmt nur die spezifizierten Daten

 for i=1:size(listing,1)
     
checkfile =   [];  
checkfile =  regexp(listing(i,1).name,'INCA_Prec_hourly');

if checkfile==1    

% NC DATEI Öffnen

ds = ncgeodataset(listing(i).name);
% var=ds.variables;
% metadata=ds.metadata;

s=ds.size('prt');
% time= ds.data('time');

name = strrep(listing(i).name, '.nc', '');
jahr=strrep(name, 'INCA_Prec_hourly_', '');

startstring='Jan-01-';
endstring=' 00:00:00';
t=strcat(startstring, jahr);
t=strcat(jahr,endstring);
t = datenum(t);
clear startstring endstring

mypath = pwd;

for k=1:s(1)
       
firstIdx = [k 1 1];
lastIdx =  [k s(2) s(3)];
value = ds.data('prt', firstIdx,  lastIdx);
value= squeeze(double(value));
% werte.(datestr(t, 'mmmddyyyyHHMM'))=value;

save([mypath 'INCA_Precip_' datestr(t, 'mmmddyyyyHHMM') '.txt'],'-ascii','value');
t= addtodate(t, 1, 'hour');

% fid = fopen([mypath datestr(t, 'mmmddyyyyHHMM') '.txt'], 'w');
% for j=1:numel(value)
%       fprintf(fid, '%6.3f\t', value(j));
% end
% fclose(fid);
% j=1;  

end
clear k value firstIdx lastIdx jahr s startstring endstring

% Zusatzinformationen
% werte.metadata=metadata;

% Koordinaten
lat=ds.geovariable('lat');
lon=ds.geovariable('lon');
lat=lat.data(1:end,1:end);
lon=lon.data(1:end,1:end);

% werte.lat=lat;
% werte.lon=lon;

fid = fopen([mypath name '_Projektion_lat' '.txt'], 'w');

for j=1:size(lat,1)
    for h=1:size(lat,2)
      fprintf(fid, '%6.3f\t\n', lat(j,h));
    end
end
fclose(fid);
clear j h

fid = fopen([mypath name '_Projektion_lon' '.txt'], 'w');

for j=1:size(lon,1)
    for h=1:size(lon,2)
      fprintf(fid, '%6.3f\t\n', lon(j,h));
    end
end
fclose(fid);


% save(name, '-struct','metadata','lat','lon','-append');

else
    continue
   
end

 end
 
end
 


Gerne möcht ich mich im programmieren verbessern, deshalb sagt mir wenn der Code umständlich usw. ist. Den Code hab ich irgendwie "zusammengeschustert"

Vielen Dank Shocked
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 05.12.2012, 22:14     Titel:
  Antworten mit Zitat      
Was nun? NC, oder NS?
NC sind für mich NETcdf daten.
Da findest du dort die entsprechenden Einlesenroutinen: http://www.mathworks.de/de/help/matlab/ref/netcdf.html
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
medicus007
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 05.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2012, 10:59     Titel:
  Antworten mit Zitat      
Hallo

Nein es sind schon NC Daten. Mit NS DAten meinte ich Niederschlagsdaten die im NC Format vorliegen.
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: 06.12.2012, 12:18     Titel: Re: NC Datei splitten und speichern
  Antworten mit Zitat      
Hallo medicus007,

Die Frage 1 ist keine Frage. Eine Antwort darauf ist dann nicht möglich.
Es ist in gewissen Grenzen sinnvoll von einem 1x1km Raster auf ein 5x5Raster zu interpolieren. Dabei gehen aber Informationen verloren und es kann zu Treppen-Effekten führen. Ein Filtern wäre hier also angemessen, z.B. ein Block-Mean, bei dem die Mittelwerte über 5 benachbarte Elemente gebildet wird. Siehe auch "help decimate".

Kommentare zum Code:
Code:
function INCA_Interpol
run C:\Users\Walter\Documents\MATLAB\nctoolbox\setup_nctoolbox.m;

listing = dir('C:\Users\Walter\Documents\MATLAB\INCA\Hourly\');
listing(1:2)=[];  % Tückisch! Es müssen nicht die ersten beiden sein!
besser:
name = {listing.name};
name(strcmp(name, '.')) = [];
name(strcmp(name, '..')) = [];

for ii = 1:numel(name)   % "i" ist tückisch, da es auch die imaginäre Einheit ist
   % checkfile =   [];  % Zeitverschwendung
   checkfile =  regexp(name{ii}, 'INCA_Prec_hourly');
   if checkfile == 1
   ...
   outFile = fullfile(mypath, 'INCA_Precip_', [datestr(t, 'mmmddyyyyHHMM') '.txt']);
   t = addtodate(t, 1, 'hour');  % ???

   fid = fopen([mypath datestr(t, 'mmmddyyyyHHMM') '.txt'], 'w');
   fprintf(fid, '%6.3f\t', value);  % Vectorizewd FPRINTF
   fclose(fid);
    % j=1;   ??? Wozu dient das?
end

% CLEAR bringt hier gar nichts, oder? das macht Matlab nicht schneller.
% clear k value firstIdx lastIdx jahr s startstring endstring

...
%for j=1:size(lat,1)
%   for h=1:size(lat,2)
      fprintf(fid, '%6.3f\t\n', transpose(lat));  % Vectorized FPRINTF
%    end
%end
fclose(fid);
 

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 05.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2012, 13:03     Titel:
  Antworten mit Zitat      
Hallo Jan

Danke für deine Antwort;
Ich hab die Verbesserungen versucht umzusetzten.
Die fprintf Zeile versteh ich nicht ganz, warum transpose?
Das dreht mir meine Matrix um?
Gibt es ein Befehl der fprintf sagt dass er x-mal beispielsweise %3.2f machen soll;
Ich habs jetzt 28 x reingeschrieben, das sieht halt wirklich mies aus.

Code:
function INCA_Interpol

% ---> NC TOOLBOX MUSS INSTALLIERT UND EINGESCHALTEN SEIN
% ---> MANUELL ERLEDIGEN

run C:\Users\Walter\Documents\MATLAB\nctoolbox\setup_nctoolbox.m;

% Ordner der Dateien angeben

listing = dir('C:\Users\Walter\Documents\MATLAB\INCA\Hourly\');
name = {listing.name};
name(strcmp(name, '.')) = [];
name(strcmp(name, '..')) = [];

% Checkfile Anfangsbuchstaben beachten, nimmt nur die spezifizierten Daten

 for ii = 1:numel(name)
     
checkfile =  regexp(name{ii}, 'INCA_Prec_hourly');

if checkfile==1    

% NC DATEI Öffnen
ds = ncgeodataset(char(name(ii)));

% Index für NC Zugriff
s=ds.size('prt');

%Zeitstempel wird erstellt
[t,nameB]=Zeit(ii,name);

% INCA Ausgangsgrid wird verkleinert (weniger Daten!)
% "Aussschneideshape" wird benötigt  
[box]=input;

% Speicher Ordner
mypath = 'C:\Users\Walter\Documents\MATLAB\INCA\';
mypath = fullfile(mypath, nameB, '\');
mkdir(mypath);
% Ruft Funktion auf und speichert Daten
DatenErrechnen(s,box,mypath,ds,t);

else
    continue
   
end

 end
 
end

function [box]=input

cd('C:\Users\Walter\Documents\MATLAB\INCA\Hourly\GISDaten');
load('INCA_32UTM_N_Projektion.mat');
box=shaperead('Melach_Hopi_Kacheln_dissolve.shp');
box=box.BoundingBox;
GrenzeLinksSpalte=find(lat<=box(1));
GrenzeRechtsSpalte=find(lat<=box(2));
GrenzeObenReihe=find(lon>=box(4));
GrenzeUntenReihe=find(lon<=box(3));

GrenzeLinksSpalte=round(max(GrenzeLinksSpalte)/size(lat,1));
GrenzeRechtsSpalte=round(max(GrenzeRechtsSpalte)/size(lat,1));
GrenzeObenReihe=GrenzeObenReihe(max(find(GrenzeObenReihe<351)));
GrenzeUntenReihe=min(GrenzeUntenReihe);

box=[GrenzeLinksSpalte GrenzeRechtsSpalte GrenzeObenReihe GrenzeUntenReihe];

end
 
function [t,nameB]=Zeit(ii,name);

nameB = strrep(char(name(ii)), '.nc', '');
jahr=strrep(nameB, 'INCA_Prec_hourly_', '');
startstring='Jan-01-';
endstring=' 00:00:00';
t=strcat(startstring, jahr);
t=strcat(jahr,endstring);
t = datenum(t);

end

function DatenErrechnen(s,box,mypath,ds,t)

for k=1:s(1)

% Zugriff auf NC Datei
firstIdx = [k box(3) box(1)];
lastIdx =  [k box(4) box(2)];
value = ds.data('prt', firstIdx,  lastIdx);
value= squeeze(double(value));
value(find(value<=0.01))=0;

outFile = fullfile(mypath, 'INCA_Precip_');

fid = fopen([outFile datestr(t, 'mmmddyyyyHHMM') '.txt'], 'w');
for ii=1:size(value, 1)
fprintf(fid, '%6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f\t\n', value(ii,:));
end
fclose(fid);

% Bei größeren Matrizen diese Speicher Mwthode wählen
% save([mypath 'INCA_Precip_' datestr(t, 'mmmddyyyyHHMM') '.txt'],'-ascii','value');
t= addtodate(t, 1, 'hour');
end

end
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: 11.12.2012, 11:48     Titel:
  Antworten mit Zitat      
Hallo medicus007,

FPRINTF arbeitet die Daten in Spalten-Richtung ab. Normalerweise möchte man das aber in Reihen-Richtung haben:
Code:
M = [1, 2; ...
    3, 4];
fprintf('%d %d\n', M);
fprintf('%d %d\n', transpose(M));

Für 28 Format-Keys:
Code:
Fmt = repmat('%g ', 1, 28);
Fmt(end) = char(10);  % Line break instead of a space
fprintf(Fmt, ceil(rand(2,28) * 10));

Gruß, Jan
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.