Conversion float to double
Résolu/Fermé
chalmia2s
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
-
14 mai 2009 à 17:02
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009 - 19 mai 2009 à 11:28
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009 - 19 mai 2009 à 11:28
A voir également:
- Conversion float to double
- Double ecran - Guide
- Whatsapp double sim - Guide
- Qwerty to azerty - Guide
- Double appel - Guide
- Double authentification google - Guide
16 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
15 mai 2009 à 15:11
15 mai 2009 à 15:11
Pourquoi vouloir absolument utiliser les pointeurs, alors que ta librairie fournit déjà un type tableau ?
Tu devrais avoir plutôt ceci (impossible pour nous de vérifier)
Tu devrais avoir plutôt ceci (impossible pour nous de vérifier)
ANNdistArray queryIn=new ANNdist[dim]; ANNdistArray dataIn=new ANNdist[nbkp][dimvect]; for(int j=0; j<nbkp; j++) for(int i=0; i<dimvect; i++) dataIn[j][i]=rd[i+j*dimvect]; for(int j=np; j<nbkp; j++) { for(int i=0; i<dimvect; i++) queryIn[i]=rq[i+j*dimvect]; kdTree = new ANNkd_tree(datatest,nPts,dim); kdTree->annkSearch(queryIn,k,nnIdx,dists,eps); disttoneigh.push_back(sqrt(dists[0])); indexdata.push_back((int)nnIdx[0]); }PS. Quand tu écris du code utilises les ballises "< code >" et "< / code >" (sans les espaces bien sûr)
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 mai 2009 à 18:17
14 mai 2009 à 18:17
À mon avis tu as surtout un problème dans l'utilisation des pointeurs...
Si il marchait, que devrais faire ton programme ?
Si il marchait, que devrais faire ton programme ?
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 mai 2009 à 18:44
14 mai 2009 à 18:44
Essaye :
for(int j=0; j<nbkp; j++) queryIn[j] = rq[j*dimvect];
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
15 mai 2009 à 13:30
15 mai 2009 à 13:30
En regardant (très très) rapidement le manuel il semble qu'ils expliquent le système de numération de ANN au chapitre 2.2 (page 13)
Pourquoi ne pas définir directement dataIn comme étant de type ANNdist ?
Pourquoi ne pas définir directement dataIn comme étant de type ANNdist ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
14 mai 2009 à 18:28
14 mai 2009 à 18:28
Tu as défini float *rd, *rq; c'est à dire que rq est un pointeur sur un nombre
Et tu utilises rq[j*dimvect]; comme si rq était un tableau de nombres !!!
Mais à mon avis c'est pas ta seule erreur...
Et tu utilises rq[j*dimvect]; comme si rq était un tableau de nombres !!!
Mais à mon avis c'est pas ta seule erreur...
chalmia2s
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
15 mai 2009 à 12:29
15 mai 2009 à 12:29
t'avais raison, ce n'est pas la seul erreur...
je travail sur la livrairie ANN : http://www.cs.umd.edu/~mount/ANN/ :
comme input du programme j'ai des float rq ,rd (normalement je peux travailler avec des fichiers: fstream: j'ai essayer ça donne le bon resultat, mais moi j'aimerai des input float!!! )
J'utilise des variables intermediaires double: queryIn et dataIn (conversion float a double ça a marcher), j'ai utiliser ces varibles intermediaire, parceque la conversion float to ANNpoint, m'affiche un message d'erreur, donc j'ai pensé a passer par des doubles.
J'ai deux problemes:
le probleme 1 c'est la lectures des valeurs des variables:
ANNpointArray dataPts; (voir le programme en bas)
ANNpoint queryPt:
est fausse donc le resultat final sera faux voila ce que j'ai mis:
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; //////// rd et l'input du programme, c 1 flaot
}
dataPts = (ANNpointArray)dataIn;
le resulat d'affichage: dataPts est totalement differente du dataIn
dataIn =
139.6146 118.2234 179.7284
126.1869 173.2475 168.8846
160.9635 143.8929 136.9884
dataPts =
104.1179 120.8073 170.6636
1.1866e-296 122.6287 144.5706
185.701 186.0399 102.5083
le probleme 2:
c'est que quand j'appele:
kdTree->annkSearch(
queryPt,
k,
nnIdx,
dists,
eps);
afin de commencer la recherche du voisin le plus proche: il y a tout qui se plante, la fenetre se ferme!!!!
je comprends pas pourkoi!!!!!!????
voila le programme:
int k = 1;
int dim = 3;
eps = 0;
int maxPts = 500;
int nPts = 0;
ANNpointArray dataPts;
ANNpoint queryPt;
ANNidxArray nnIdx;
ANNdistArray dists;
ANNkd_tree* kdTree;
nnIdx = new ANNidx[k];
dists = new ANNdist[k];
double **dataIn;
double *queryIn;
int nbkp, nbkp_d, dimvect, dimvect_d;
int l1, l2, l1q, l2q; //input
float *rd; //input
float *rq; //input
nbkp_d = l1;
dimvect_d = l2;
dataIn = new double*[nbkp_d];
for(int i=0; i<nbkp_d; i++)
dataIn[i] = new double[dimvect_d];
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; // lecture de l'input 1
}
nbkp = l1q;
dimvect = l2q;
vector<int> indexdata;
vector<float> disttoneigh;
queryIn = new double[dimvect];
queryPt = annAllocPt(dimvect);
dataPts = annAllocPts(nbkp_d,dimvect_d);
dataPts = (ANNpointArray)dataIn;
kdTree = new ANNkd_tree( // construction de l'arbre de recherche
dataPts,
nPts,
dim);
int np=0;
while ( np < nbkp) {
for(int i = 0; i < dimvect; i++)
queryIn[i] = rq[i+np*dimvect]; // lecture de l'input 2
queryPt = queryIn;
kdTree->annkSearch(
queryPt,
k,
nnIdx,
dists,
eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
np++;
}
le programe retourne: disttoneigh, indexdata;
je travail sur la livrairie ANN : http://www.cs.umd.edu/~mount/ANN/ :
comme input du programme j'ai des float rq ,rd (normalement je peux travailler avec des fichiers: fstream: j'ai essayer ça donne le bon resultat, mais moi j'aimerai des input float!!! )
J'utilise des variables intermediaires double: queryIn et dataIn (conversion float a double ça a marcher), j'ai utiliser ces varibles intermediaire, parceque la conversion float to ANNpoint, m'affiche un message d'erreur, donc j'ai pensé a passer par des doubles.
J'ai deux problemes:
le probleme 1 c'est la lectures des valeurs des variables:
ANNpointArray dataPts; (voir le programme en bas)
ANNpoint queryPt:
est fausse donc le resultat final sera faux voila ce que j'ai mis:
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; //////// rd et l'input du programme, c 1 flaot
}
dataPts = (ANNpointArray)dataIn;
le resulat d'affichage: dataPts est totalement differente du dataIn
dataIn =
139.6146 118.2234 179.7284
126.1869 173.2475 168.8846
160.9635 143.8929 136.9884
dataPts =
104.1179 120.8073 170.6636
1.1866e-296 122.6287 144.5706
185.701 186.0399 102.5083
le probleme 2:
c'est que quand j'appele:
kdTree->annkSearch(
queryPt,
k,
nnIdx,
dists,
eps);
afin de commencer la recherche du voisin le plus proche: il y a tout qui se plante, la fenetre se ferme!!!!
je comprends pas pourkoi!!!!!!????
voila le programme:
int k = 1;
int dim = 3;
eps = 0;
int maxPts = 500;
int nPts = 0;
ANNpointArray dataPts;
ANNpoint queryPt;
ANNidxArray nnIdx;
ANNdistArray dists;
ANNkd_tree* kdTree;
nnIdx = new ANNidx[k];
dists = new ANNdist[k];
double **dataIn;
double *queryIn;
int nbkp, nbkp_d, dimvect, dimvect_d;
int l1, l2, l1q, l2q; //input
float *rd; //input
float *rq; //input
nbkp_d = l1;
dimvect_d = l2;
dataIn = new double*[nbkp_d];
for(int i=0; i<nbkp_d; i++)
dataIn[i] = new double[dimvect_d];
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; // lecture de l'input 1
}
nbkp = l1q;
dimvect = l2q;
vector<int> indexdata;
vector<float> disttoneigh;
queryIn = new double[dimvect];
queryPt = annAllocPt(dimvect);
dataPts = annAllocPts(nbkp_d,dimvect_d);
dataPts = (ANNpointArray)dataIn;
kdTree = new ANNkd_tree( // construction de l'arbre de recherche
dataPts,
nPts,
dim);
int np=0;
while ( np < nbkp) {
for(int i = 0; i < dimvect; i++)
queryIn[i] = rq[i+np*dimvect]; // lecture de l'input 2
queryPt = queryIn;
kdTree->annkSearch(
queryPt,
k,
nnIdx,
dists,
eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
np++;
}
le programe retourne: disttoneigh, indexdata;
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
15 mai 2009 à 12:58
15 mai 2009 à 12:58
dataPts = (ANNpointArray)dataIn;
C'est un jolie cast mais, comme nous n'avons pas ANNpointArray, difficile de dire si il est justifié.
à mon avis, tu veux beaucoup trop mélangé des torchons et des serviettes (comme dirsait mon prof de math).
Comme dit KX, ça viens probablement de ta gestion des pointeurs.
C'est un jolie cast mais, comme nous n'avons pas ANNpointArray, difficile de dire si il est justifié.
à mon avis, tu veux beaucoup trop mélangé des torchons et des serviettes (comme dirsait mon prof de math).
Comme dit KX, ça viens probablement de ta gestion des pointeurs.
chalmia2s
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
15 mai 2009 à 13:14
15 mai 2009 à 13:14
merci pour le compliment :-) moi aussi je trouve que ce cast est joli :-)...
bon je sais que j'ai des problemes.
faire:
dataPts = dataIn
ne marche pas aussi, tu auras une autre idee pour regler ça
bon je sais que j'ai des problemes.
faire:
dataPts = dataIn
ne marche pas aussi, tu auras une autre idee pour regler ça
chalmia2s
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
15 mai 2009 à 13:15
15 mai 2009 à 13:15
en faite pourkoi tu di kon a pas de ANNpointArray?
dataPts est de type ANNpointErray
dataPts est de type ANNpointErray
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
15 mai 2009 à 13:21
15 mai 2009 à 13:21
Parce qu'on ne sait pas ce qu'il y a dans ANNpointArray !!!
Sauf erreur si tu fais dataPts = (ANNpointArray)dataIn; par défaut ton compilateur va (très) bêtement prendre les données binaires de dataIn et les mettre dans dataPts, mais si ils n'utilisent pas le même système de numération alors forcément ça va pas te donner le même résultat...
Sauf erreur si tu fais dataPts = (ANNpointArray)dataIn; par défaut ton compilateur va (très) bêtement prendre les données binaires de dataIn et les mettre dans dataPts, mais si ils n'utilisent pas le même système de numération alors forcément ça va pas te donner le même résultat...
chalmia2s
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
15 mai 2009 à 14:34
15 mai 2009 à 14:34
effectivement voila ce que j'ai fait (si c juste et c ce que tu voulais dire :-) )
ANNdistArray queryIn;
ANNdistArray *dataIn;
queryIn = new ANNdist[dim];
dataIn =new ANNdist*[nbkp];
for(int i=0; i<nbkp; i++)
dataIn[i] = new ANNdist[dimvect];
for(int j = 0; j < nbkp; j++) {
for(int i = 0; i < dimvect; i++)
dataIn[j][i] = rd[i+j*dimvect]; //Input float
}
kdTree = new ANNkd_tree(
datatest,
nPts,
dim);
while ( np < nbkp) {
for(int i = 0; i < dimvect; i++){
queryIn[i] = rq[i+np*dimvect];
}
kdTree->annkSearch(
queryIn,
k,
nnIdx,
dists,
eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
np++;
}
la compilation marche MAIS dès que j'appele la fonction il y a tous qui se plante et la fenetre se ferme !!!!!!
il me semble qu'il y a une erreur dans la construction de l'arbre: kdTree = new ANNkd_tree(...
Mais je vois pas comment le regler
ANNdistArray queryIn;
ANNdistArray *dataIn;
queryIn = new ANNdist[dim];
dataIn =new ANNdist*[nbkp];
for(int i=0; i<nbkp; i++)
dataIn[i] = new ANNdist[dimvect];
for(int j = 0; j < nbkp; j++) {
for(int i = 0; i < dimvect; i++)
dataIn[j][i] = rd[i+j*dimvect]; //Input float
}
kdTree = new ANNkd_tree(
datatest,
nPts,
dim);
while ( np < nbkp) {
for(int i = 0; i < dimvect; i++){
queryIn[i] = rq[i+np*dimvect];
}
kdTree->annkSearch(
queryIn,
k,
nnIdx,
dists,
eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
np++;
}
la compilation marche MAIS dès que j'appele la fonction il y a tous qui se plante et la fenetre se ferme !!!!!!
il me semble qu'il y a une erreur dans la construction de l'arbre: kdTree = new ANNkd_tree(...
Mais je vois pas comment le regler
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
15 mai 2009 à 15:33
15 mai 2009 à 15:33
for(int i = 0; i < dimvect; i++){
queryIn[i] = rq[i+np*dimvect];
}
tu dimensionne queryIn à dim et tu va jusqu'à dimvect, même si c'est juste, ce n'est pas très cohérent.
queryIn[i] = rq[i+np*dimvect];
}
tu dimensionne queryIn à dim et tu va jusqu'à dimvect, même si c'est juste, ce n'est pas très cohérent.
chalmia2s
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
15 mai 2009 à 16:39
15 mai 2009 à 16:39
je travail avec les pointeurs, parceque pour lire l'input, il faut passer par la fonction predefinie:
et rd, le parametre 4 de cette fonction est un pointeur de type: lme_float64 *rd;
donc pour l'affectation:
datatest[j][i] = rd[i+j*dimvect_d]; //// (ligne B)
il faut que "dataIn" soit un pointeur.
sinon declarer dataIn comme ça:
ANNdistArray dataIn=new ANNdist[nbkp][dimvect];
il y les erreures:
//// pour la (ligne B)
1>c:\...\annkp.cpp(35) : error C2440: '=' : impossible de convertir de 'ANNdist (*)[dimvect]' en 'ANNdistArray'
/// (pour la ligne A)
1>c:\...\annkp.cpp(38) : error C2109: un indice requiert un type tableau ou pointeur
/// lors de la construction de l'arbre de recherche
1>c:\...\annkp.cpp(53) : error C2664: 'ANNkd_tree::ANNkd_tree(int,int,int)' : impossible de convertir le paramètre 1 de 'ANNdistArray' en 'int'
pour: Char Snipeur
il me semble que c juste
a chaque iterarion np: queryIn prends les valeurs d'une ligne de rq.
if(!LMECB_GetMatrix(1, &l1, &l2, &rd, NULL)) return 0; nbkp = l1; dimvect = l2; dataIn =new ANNdist*[nbkp]; for(int i=0; i<nbkp; i++) dataIn[i] = new ANNdist[dimvect]; for(int j = 0; j < nbkp; j++) { for(int i = 0; i < dimvect; i++) dataIn[j][i] = rd[i+j*dimvect]; //////(ligne A) }
et rd, le parametre 4 de cette fonction est un pointeur de type: lme_float64 *rd;
donc pour l'affectation:
datatest[j][i] = rd[i+j*dimvect_d]; //// (ligne B)
il faut que "dataIn" soit un pointeur.
sinon declarer dataIn comme ça:
ANNdistArray dataIn=new ANNdist[nbkp][dimvect];
il y les erreures:
//// pour la (ligne B)
1>c:\...\annkp.cpp(35) : error C2440: '=' : impossible de convertir de 'ANNdist (*)[dimvect]' en 'ANNdistArray'
/// (pour la ligne A)
1>c:\...\annkp.cpp(38) : error C2109: un indice requiert un type tableau ou pointeur
/// lors de la construction de l'arbre de recherche
1>c:\...\annkp.cpp(53) : error C2664: 'ANNkd_tree::ANNkd_tree(int,int,int)' : impossible de convertir le paramètre 1 de 'ANNdistArray' en 'int'
pour: Char Snipeur
For(int i = 0; i < dimvect; i++){ queryIn[i] = rq[i+np*dimvect]; }
il me semble que c juste
a chaque iterarion np: queryIn prends les valeurs d'une ligne de rq.
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
15 mai 2009 à 16:45
15 mai 2009 à 16:45
Ce que voulait dire Char Snipeur c'est qu'il y a une "contradiction" entre :
ta boucle For(int i = 0; i < dimvect; i++) et ta définition =new ANNdist[dim];
Pour le reste à mon avis, ce'st pas le pointeur qu'il faut transférer mais la valeur...
dataIn[j][i] = *rd[i+j*dimvect];
ta boucle For(int i = 0; i < dimvect; i++) et ta définition =new ANNdist[dim];
Pour le reste à mon avis, ce'st pas le pointeur qu'il faut transférer mais la valeur...
dataIn[j][i] = *rd[i+j*dimvect];
chalmia2s
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
15 mai 2009 à 16:56
15 mai 2009 à 16:56
j'ai comme erreur:
error C2100: indirection non conforme!!!!
error C2100: indirection non conforme!!!!
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
15 mai 2009 à 17:01
15 mai 2009 à 17:01
À chaque fois que tu vas avoir une erreur de corrigée tu en auras une autre qui arrive, et le problème c'est qu'on a pas une vision d'ensemble du code, on ne peux pas te proposer une solution miracle...
Dans le dernier bout de code que tu as mis tu faisif(!LMECB_GetMatrix(1, &l1, &l2, &rd, NULL))
Tu as dit que rd était un pointeur ... Alors pourquoi utilises-tu &rd ?
Dans le dernier bout de code que tu as mis tu faisif(!LMECB_GetMatrix(1, &l1, &l2, &rd, NULL))
Tu as dit que rd était un pointeur ... Alors pourquoi utilises-tu &rd ?
chalmia2s
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
19 mai 2009 à 11:28
19 mai 2009 à 11:28
La faute etait que avant la création de l'arbre il faillais specifier le nombre de points de datatest
mettre: nPts = nbkp_d; (pour dim c'etait fait)
MOI J'ai laissé nPts=0; !!!!! :-)
kdTree = new ANNkd_tree(
datatest,
nPts,
dim);
desolé de vous avoir pris du temps pour une faute de n'importe quoi :-)
mettre: nPts = nbkp_d; (pour dim c'etait fait)
MOI J'ai laissé nPts=0; !!!!! :-)
kdTree = new ANNkd_tree(
datatest,
nPts,
dim);
desolé de vous avoir pris du temps pour une faute de n'importe quoi :-)