source: trunk/src/missingdaytonan.m @ 327

Last change on this file since 327 was 327, checked in by pinsard, 13 years ago

change svn properties

  • Property svn:keywords set to URL
File size: 6.3 KB
Line 
1function [mat_withnan, dimtemp_complete] = missingdaytonan(mat_ini,dimtemp)
2
3%MISSINGDAYTONAN est une fonction permettant, pour des donnees journalieres
4%concatenees, de remplir les jours manquants par des 'NaN' dans la matrice
5%de donnees et de mettre a jour la matrice temporelle.
6
7%
8%+
9%
10% ==================
11% missingdaytonan.m
12% ==================
13%
14% .. function:: missingdaytonan(mat_ini,dimtemp)
15%
16% DESCRIPTION
17% ===========
18%
19% - Donnees d'entrees :
20%
21%   * mat_ini : Matrice 3D de donnees initiales dont la premiere dimension
22%     est le temps.
23%   * dimtemp : Variable de la dimension temporelle de la matrice de
24%     donnees initiales, en jour julien.
25%
26% - Donnees de sorties :
27%
28%   * mat_withnan : Matrice 3D de donnees finales avec des 'NaN' pour les
29%     jours initialement manquants.
30%   * dimtemp_complete : Variable de la dimension temporelle de la matrice
31%     de donnees finales, en jour julien.
32%
33% EXAMPLES
34% ========
35%
36% Voir la 'demo'.
37%
38% SEE ALSO
39% ========
40%
41% :func:`cumulEPSAT_concat`
42% :func:`intensityMSG_concat`
43%
44% :func:`box5x5serietemp`
45%
46% TODO
47% ====
48%
49% use eomday
50%
51% describe demo
52%
53% EVOLUTIONS
54% ==========
55%
56% $Id$
57%
58% $URL$
59%
60% - jaclod 2011-07-27
61%
62%   * Ajout de la documentation, des commentaires et de la demonstration.
63%
64% - jaclod 2011-07-26
65%
66%   * Creation.
67%
68%-
69
70%%%%%%%%%%%%%%%%%
71% Initialisation
72%%%%%%%%%%%%%%%%%
73
74% Matrice comportant le nombre de jours maximum dans chaque mois.
75maxjourmois = [31 29 31 30 31 30 31 31 30 31 30 31];
76
77% Matrice, aux dimensions spatiales de la matrice initiale, ne comportant
78% que des 'NaN'.
79nanmat = zeros(size(mat_ini,2),size(mat_ini,3));
80nanmat(nanmat==0)=NaN;
81nanmat = permute(nanmat,[3 1 2]);
82
83% Passage de l'information temporelle dans une matrice separant chaque
84% element de la date.
85tempvec = datevec(dimtemp);
86
87% Recuperation du premier et dernier mois de donnees.
88Mois_start = tempvec(1,2);
89Mois_stop = tempvec(size(tempvec,1),2);
90
91% Initialisation des donnees de sorties qui seront modifiees tout au long
92% de cette fonction.
93mat_withnan = mat_ini;
94dimtemp_complete = dimtemp;
95
96%%%%%%%%%%%%%%%%%
97
98
99%%%%%%%%%%%%%%%%%%%%%%
100% Boucle sur les mois
101%%%%%%%%%%%%%%%%%%%%%%
102
103for Mois = Mois_start : Mois_stop;
104
105    % Tant que le mois ne compte pas son nombre de jours maximum, on
106    % cherche les jours manquants.
107    while size(find(tempvec(:,2)==Mois),1) ~= maxjourmois(Mois);
108
109        Jour = 1;
110
111        % Verification sur chaque jour.
112        while Jour <= maxjourmois(Mois);
113
114            % On recherche les indices des dates du mois dans la matrice
115            % 'tempvec'.
116            indmois = find(tempvec(:,2)==Mois);
117
118            % Si on ne trouve pas le jour dans le mois, on continue. Sinon
119            % on passe au jour suivant.
120            if isempty(find(tempvec(indmois,3)==Jour, 1));
121
122                % Il faut trouver a quel endroit il faut ajouter des NaN.
123                % On cherche le jour present precedent ou, a defaut, le
124                % jour suivant.
125                Jourprec = Jour - 1;
126                indprec = find(tempvec(indmois,3)==Jourprec);
127
128                while Jourprec ~= 0 && isempty(indprec) == 1;
129
130                    Jourprec = Jourprec - 1;
131                    indprec = find(tempvec(indmois,3)==Jourprec);
132
133                end
134
135                % S'il n'y avait pas de jour precedent, on cherche parmi
136                % les suivants.
137                if isempty(indprec) == 1;
138
139                    Joursuiv = Jour + 1;
140                    indsuiv = find(tempvec(indmois,3)==Joursuiv);
141
142                    while Joursuiv ~= maxjourmois(Mois) && isempty(indsuiv) == 1;
143
144                        Joursuiv = Joursuiv + 1;
145                        indsuiv = find(tempvec(indmois,3)==Joursuiv);
146
147                    end
148
149                    % Si on a l'indice suivant, on en deduit l'indice
150                    % precedent.
151                    indprec = indsuiv - 1;
152
153                else
154
155                    % Si on a l'indice precedent, on en deduit l'indice
156                    % suivant.
157                    indsuiv = indprec + 1;
158
159                end
160
161                % Ajout de Nan entre les jours precedents et suivants.
162                indinf = indmois(1)-1+indprec;
163                indsup = indmois(1)-1+indsuiv;
164
165                % L'ajout different selon l'emplacement du jour par rapport
166                % a l'ensemble. Il peut etre encercle ou sur une extremite.
167                if indinf ~= 0 && indsup <= size(mat_withnan,1);
168
169                    % Dans ce cas, on est entoure par d'autres jours
170                    % presents.
171                    mat_withnan = cat(1,mat_withnan(1:indinf,:,:),nanmat(1,:,:),mat_withnan(indsup:size(mat_withnan,1),:,:));
172                    dimtemp_complete = cat(2,dimtemp_complete(1:indinf),datenum(tempvec(1,1),Mois,Jour),dimtemp_complete(indsup:size(dimtemp_complete,2)));
173
174                else
175
176                    % Dans ce cas on est sur l'une des extrimite. Le suite
177                    % depend s'il s'agit du premier ou du dernier jour.
178                    if indinf == 0;
179
180                        % Dans ce cas, ce jour manquant est le premier
181                        % jour.
182                        mat_withnan = cat(1,nanmat,mat_withnan(1:size(mat_withnan,1),:,:));
183                        dimtemp_complete = cat(2,datenum(tempvec(1,1),Mois,Jour),dimtemp_complete(indsup:size(dimtemp_complete,2)));
184
185                    elseif indsup > size(mat_withnan,1);
186
187                        % Dans ce cas ce jour manquant est le dernier jour.
188                        mat_withnan = cat(1,mat_withnan(1:indinf,:,:),nanmat);
189                        dimtemp_complete = cat(2,dimtemp_complete(1:indinf),datenum(tempvec(1,1),Mois,Jour));
190
191                    end
192
193                end
194
195                % Mise a jour des informations temporelles.
196                tempvec = datevec(dimtemp_complete);
197
198            end
199
200            % Modification de la variable 'Jour', on s'interesse au jour
201            % suivant.
202            Jour = Jour + 1;
203
204        end
205
206    end
207
208end
209
210%%%%%%%%%%%%%%%%%%%%%%
211
212end
213
214%!demo
215%! clear all
216%! close all
217%! varamma_startup
218%! more off
219%! [ij_intensity_concat, time_concat, Longitudes, Latitudes] = intensityMSG_concat('extracted', 0, 0, 0, 0, 200, 200, 2006, 09, 01, 09, 30);
220%! [ij_intensity_concat_withnan, time_concat_complete] = missingdaytonan(ij_intensity_concat, time_concat)
221%! whos('ij_intensity_concat', 'time_concat', 'ij_intensity_concat_withnan', 'time_concat_complete');
Note: See TracBrowser for help on using the repository browser.