1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| %% ********************************************************************* %%
%% CHOIX DES DONNEES %%
%% ********************************************************************* %%
% Choix du fichier de débit à utiliser :
FichierHoule = 'ExempleScatterBox.txt'
%% ********************************************************************* %%
%% ETAPE 1 : Importation des données %%
%% ********************************************************************* %%
% Ouverture du fichier texte dans lequel il y a les houles.
fid=fopen(FichierHoule,'r'); % 'r' = open file for reading
% Lecture d'un texte formaté.
m=textscan(fid,'%f %f %f','delimiter');
% fid : identification du fichier
% '%f %f %f %f' : Il y a 4 champs numériques
% 'delimiter' : Champs délimité par un espace.
% Fermeture du fichier après lecture.
fclose(fid);
X=m{2}; % La colonne 1 de ma matrice m contient les valeurs X.
Y=m{1}; % La colonne 2 de ma matrice m contient les valeurs Y.
Z=m{3}; % La colonne 3 de ma matrice m contient les valeurs Z.
%% ********************************************************************* %%
%% ETAPE 2 : Création du graphe %%
%% ********************************************************************* %%
%%%%%%%%% scatter(X,Y,'.k')
%% ********************************************************************* %%
%% ETAPE 3 : Calcul des classes en focntion de X %%
%% ********************************************************************* %%
% Trier les lignes en fonction de X, pour que les valeurs soient rangées
% dans l'ordre croissant.
Matrice = horzcat (X, Y, Z); % Je concatènne mes colonne X, Y et Z en une matrice
Tri = sortrows (Matrice); % Je tri ma matrice en fonction de ma première colonne
% J'aurais pu écrire : Tri = sortrows (matrice, 1)
Xter=Tri(:,1); % La colonne 1 de ma matrice Tri contient les valeurs X.
Yter=Tri(:,2); % La colonne 2 de ma matrice Tri contient les valeurs Y.
Zter=Tri(:,3); % La colonne 3 de ma matrice Tri contient les valeurs Z.
Dlig=length(Xter); % Il y a length(X) lignes dans ma matrice. Dlig est le numéro de ma dernière ligne.
Ztot=sum(Zter)/10; % Comme je veux 10 classes avec une somme des Z identique, je calcule la somme totale de mes Z
Deb = 1 % 1ère ligne à prendre en compte
SumZbis=Zter(1) % J'initialise ma variable.
% Je crée un cell-array vide. c'est un conteneur de type hétérogène. Je peux mettre ce que
% je veux dans chaque case, des matrices, des strings (alors qu'une matrice ne contient que du numérique)
all_matrices={};
n=1 % j'initialise la variable n qui représente les colonnes de all_matrices{c,n}
lig=2
while lig < Dlig+1 % Pour chacune des lignes, à partir de la deuxième ...
SumZbis= SumZbis + Zter(lig); % La somme des Z = La somme déjà calculée + Z(lig)
if SumZbis >= n*Ztot % Si ma somme dépasse n*Ztot (la valeur de Z théorique de chacune des 10 cases que je veux dessiner)
if SumZbis-(n*Ztot) > (n*Ztot)-(SumZbis-Zter(lig-1)) % Et si l'écart entre cette valeur théorique et SumZ est supérieur à l'écart entre la valeur théorique et SumZ-Z(lig-1), alors
all_matrices{n} = Matrice(Deb:lig-1 , :);
Deb=lig % 1ère ligne à prendre en compte pour la prochaine case.
else % Sinon, c'est-à-dire, si l'écart entre la valeur théorique et Sum.Z(lig) est inférieure à l'écart entre la valeur théorique et Sum.Z(lig-1), alors
all_matrices{n} = Matrice(Deb:lig , :);
Deb=lig % 1ère ligne à prendre en compte pour la prochaine case.
end
n = n+1
end
% if SumZ >= sum(Zbis)
% break
% end
lig = lig+1
end
%% ********************************************************************* %%
%% ETAPE 4 : Calcul des classes en focntion de Y %%
%% ********************************************************************* %%
clear Deb Tri Dlig n lig
% Trier les lignes en fonction de X, pour que les valeurs soient rangées
% dans l'ordre croissant, POUR CHAQUE all_matrices{n}
for n = 1 : 10
Tri = sortrows (all_matrices{n},2); % Je tri ma matrice en fonction de ma deuxième colonne.
Xter=Tri(:,1); % La colonne 1 de ma matrice Tri contient les valeurs X.
Yter=Tri(:,2); % La colonne 2 de ma matrice Tri contient les valeurs Y.
Zter=Tri(:,3); % La colonne 3 de ma matrice Tri contient les valeurs Z.
Dlig=length(Yter); % Il y a length(X) lignes dans ma matrice. Dlig est le numéro de ma dernière ligne.
Ztot2=sum(Zter)/10; % Je veux 10 classes pour chacune des 10 matrices qui
% contiennent déjà 1/10ème du Z total. Donc ici Ztot correspond à 1/10 du Ztot de l'etape 3..
Deb = 1 % 1ère ligne à prendre en compte
SumZter=Zter(1) % J'initialise ma variable. ...DANS QUELLE SOUS-MATRICE ?
% Je crée un cell-array vide. c'est un conteneur de type hétérogène. Je peux mettre ce que
% je veux dans chaque case, des matrices, des strings (alors qu'une matrice ne contient que du numérique)
all_matrices2={};
c=1 % j'initialise la variable n qui représente les colonnes de all_matrices{c,n}
lig=2
while lig < Dlig+1 % Pour chacune des lignes, à partir de la deuxième ...
SumZter= SumZter + Zter(lig); % La somme des Z = La somme déjà calculée + Z(lig)
if SumZter >= n*Ztot2 % Si ma somme dépasse n*Ztot (la valeur de Z théorique de chacune des 10 cases que je veux dessiner)
if SumZter-(n*Ztot2) > (n*Ztot2)-(SumZter-Zter(lig-1)) % Et si l'écart entre cette valeur théorique et SumZ est supérieur à l'écart entre la valeur théorique et SumZ-Z(lig-1), alors
all_matrices2{n,c} = Matrice(Deb:lig-1 , :);
Deb=lig % 1ère ligne à prendre en compte pour la prochaine case.
else % Sinon, c'est-à-dire, si l'écart entre la valeur théorique et Sum.Z(lig) est inférieure à l'écart entre la valeur théorique et Sum.Z(lig-1), alors
all_matrices2{n,c} = Matrice(Deb:lig , :);
Deb=lig % 1ère ligne à prendre en compte pour la prochaine case.
end
c = c+1
end
% if SumZ >= sum(Zbis)
% break
% end
lig = lig+1
end
end |
Partager