Pages

Affichage des articles dont le libellé est Dimensions. Afficher tous les articles
Affichage des articles dont le libellé est Dimensions. Afficher tous les articles

Optimisation : tri tableau à 2 dimensions sujet

mardi 8 avril 2014




Bonjour

Je souhaiterais optimiser mon code .
Un petit exemple :
J ai le tableau X[] {3,9,2}
Apres le tir j obtiens 2,3,9

Mon objectif est de faire la difference entre la position initale de 3 et sa nouvelle position,(0-1 = 1) idem avec les autres valeurs de mon tableau
Pour y parvenir, actuellement je cree un tableau initial, un tableau target qui me servira à trier et remplacer les valeurs et un tableau posi qui me servira à comparer les positions initiales et trier.
A l issue je boucle sur l index que je compare à la vealeur de Posi[index]....
C est lent et peut certainement etre optimisé par le tri d un tableau à 2 dimensions ? Qu en pensez vous ?
Merci pour votre aide, commentaires etc

stéphane

mon code :


Code:


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
 
int T = 30;
Double[] X = { 44.3, 21.3, 31.4, 8.7, 12.8, 45.0, 88.1, 32.0, 53.2, 30.3, 95.8, 50.4, 71.6, 26.7, 3.8, 36, 46, 34.3, 77.2, 55.3, 64.2, 85.5, 18.6, 50.9, 93.6, 26.8, 59, 99.1, 57, 78.1 };

double[] target= new double [T];
int[] posi= new int[T];
for (int Idx = 0; Idx < T; Idx++)
{
target[Idx] = X[Idx];
posi[Idx] = Idx;
}
//---Tri
for (int k = 0; k < T; k++)
{
for (int i = k+1; i < T; i++)
{
if (target[i] < target[k])
{
double tmp = target[k];
target[k] = target[i];
target[i] = tmp;
int tmp2 = posi[k];
posi[k] = posi[i];
posi[i] = tmp2;
}
}
}
int Diff;
int D_t=0;
for (int i = 0; i < T; i++)
{
Diff = posi[i] - i;
Diff = Diff * Diff;
D_t = D_t + Diff;
}






[PROC] Trouver la valeur la plus proche (deux dimensions) sujet

vendredi 28 mars 2014




Bonjour,

je dispose d'une table d'évenements avec pour chaque évenement un datetime et des coordonnées lat et lon :


Code:


1
2
3
4
5
6
7
8
9
10
11
12


data events;
format dt datetime. ;
input eventid dt datetime18. lat lon;
datalines;
1 07JAN2004:08:07:00 52.268157 -86.923828
2 09JAN2004:03:04:00 32.398516 -19.951172
3 13JAN2004:02:01:00 52.855864 -11.953125
4 01JAN2004:01:04:00 28.998532 -17.666016
;
run;



d'autre part j'ai des stations de mesure pour lesquelles je dispose de certains relevés avec datetime,lat,lon :


Code:


1
2
3
4
5
6
7
8
9
10
11
12


data stations;
format dt datetime. ;
input staid dt datetime18. lat lon mes1;
datalines;
1 07JAN2004:01:07:00 52.968157 -86.923728 11.2
2 09JAN2004:09:04:00 31.398316 -19.951172 4.6
3 13JAN2004:02:01:00 52.955864 -11.953125 7.0
4 01JAN2004:07:04:00 28.998532 -17.616016 -7.1
;
run;


Je cherche à obtenir pour chaque évenement la mesure prise par la station la plus proche au moment le plus proche. (toutes les stations n'ont pas de mesures pour toutes les heures)

actuellement je fais ceci est sql, je retiens pour chaque évenements, les mesures qui ont lieu dans n'importe quelle station avec +/- 3 heures et je garde uniquement la plus proche géographiquement, de ce résultat je garde la plus proche temporellement. je filtre ensuite les doublons pour éliminer les exequos.


Code:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

proc sql;
create table croisement as
select * from (
select t0.*,t1.dt as dtmesure,t1.mes1,geodist(t0.lat,t0.lon,t1.lat,t1.lon) as distanceGeo,abs(t0.dt-t1.dt) as distanceTemps
from events as t0,stations as t1 where abs(t0.dt-t1.dt)<3600*3
group by t0.idEvent
having geodist(t0.lat,t0.lon,t1.lat,t1.lon)=min(geodist(t0.lat,t0.lon,t1.lat,t1.lon))
)
group by t0.idEvent
having distanceTemps=min(distanceTemps);
quit;


proc sort data=croisement nodupkey;
by idEvent;
run;


Ce code fonctionne mais il est très lent pour un grand nombre d'évenements (~500k évenements vs 4M de mesures) et il ne permet pas de préciser des tolérences, pour par exemple
prendre la deuxième station la plus proche si celle ci a une distance temporelle très petite par rapport à la plus proche.
Je me demandais si avec les procédures STAT(tree ? fastclus?) il n'y aurait pas mieux sans se lancer dans des algos d'optimisations compliqués ?
Je suis preneur de vos idées :)




Créer un tableau dynamique à 2 dimensions dans une structure en C99. sujet

jeudi 27 mars 2014




Bonjour, :lol:

Tout est dans le titre, ou presque.

Je suis sous Windows 8.1, IDE Code::Blocks 13.12 et je m'initie doucement au C et à la bibliothèque SDL 2.0.

Je suis en train d'essayer de retranscrire un Labyrinthe, que j'avais fait et qui fonctionne sous wxLua.

Mais là n'est pas le problème.

Pour le moment, je souhaiterais pouvoir créer une table dynamique à 2 dimensions dans une structure.

Mon compilateur utilise le C99, qui si j'ai bien compris me permet de ne pas utiliser "malloc".

Si je déclare mon tableau dynamique 2 dimensions dans une fonction (pas dans la structure), ça fonctionne.

Si je déclare un tableau dynamique à 1 dimension dans la structure, ça fonctionne.

A deux dimensions, ça plante, pas à la compilation mais au lancement du programme.

Dans ma structure j'ai bien défini mon tableau avec 2 étoiles: **t_cases;

Je définis bien ma variable de structure, j'appelle sans problème les autres variables.

Je ne sais plus où chercher... :aie:

Un petit bout de code, peut-être?


Code:


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

Dans main.h

typedef struct s_labyrinthe s_labyrinthe;
struct s_labyrinthe
{
... ... ...
Uint16 **t_cases;
.... .... ....
};

Dans le main
int main(int argc, char *argv[])
{
s_labyrinthe data; // définition de la variable de structure

// définition des variables lignes colonnes.
Uint16 xCases = data.Longueur - data.dx;
Uint16 yCases = data.Largeur - data.dy;

data.t_cases[xCases][yCases]; // dans cette exemple je ne vais pas plus loin, c'est la que ça plante...
... ... ...

return 0;
}



Merci pour toute l'aide que vous pourrez m'apporter et bonne journée à vous.


Claude.