2016-04-08 15 views
0

Ich habe zwei Arrays mit 64-Bit-Ganzzahlen (eine für die x- und eine für die y-Werte) Ich möchte mit einer geraden Linie beginnend vom Ursprung passen. Sie haben beide Länge num.Lineare Anpassung mit GNU Scientific Library in C

Ich habe eine vorherige Parsing der beiden Arrays, so dass sie beginnen, wenn sie beide Null sind, so dass ich eine der beiden Arrays verschieben, entsprechend dem Wert von result entweder durch pos1 oder durch pos2 .

Nun, wie ich schon sagte, die Arrays sind 64-Bit-Integer-Größe, so dass ich sie als Double Cast. Aber wenn ich den folgenden Code anrufe, stürzt das Programm ab. c1, cov11 und sumsq sind außen als Doppelzeiger definiert.

if(result > 0) 
gsl_fit_mul((double *) array1 + pos2, 1,(double *) array2, 1, (num - pos2 - 1) * sizeof(uint64_t), c1, cov11, sumsq); 
else 
gsl_fit_mul((double *) array1, 1, (double *) array2 + pos1, 1, (num - pos2 - 1) * sizeof(uint64_t), c1, cov11, sumsq); 

Ich versuchte the documentation zu lesen, aber es ist actully nicht so klar, und ich denke, das Problem zu dem Arrays im Aufruf ist.

Vielen Dank im Voraus.


EDIT: Ich änderte Ansatz. Ich schrieb diese Funktion

void findFit(uint64_t *array1, uint64_t *array2, uint64_t num, double c1){ 
    double *array1_parallel = malloc(num * sizeof(double)), *array2_parallel = malloc(num * sizeof(double)); 

    for(uint64_t i = 0; i < num; i++){ 
     array1_parallel[i] = (double) array1[i]; 
     array2_parallel[i] = (double) array2[i]; 
    } 

    double *cov11, *sumsq; 

    gsl_fit_mul(array1_parallel, 1, array2_parallel, 1, num, &c1, cov11, sumsq); 

    free(array2_parallel); 
    free(array1_parallel); 

    return; 
} 

es vorbei an den bereits verschoben und analysiert Arrays, aber es ist immer noch nicht funktioniert ...

+0

Sie können nicht ein ganzes Array nur durch den Zeiger werfen. Sie müssen jedes Element umwandeln. Sie benötigen also ein paralleles Array von Doppelpunkten und füllen sie mit den int-Werten. Einer nach dem anderen. In einer Schleife. – joop

+0

Danke für die schnelle Antwort. Wenn die Integer-Arrays die Dimension 'num * sizeof (uint64_t)' haben, sollte ich 'num * sizeof (double)' für das parallele Array zuweisen? – Enzo

+0

Ja, das ist im Grunde die Idee. Gleiche Anzahl von Elementen. (aber Größen von Elementen * können * abweichen. (irrelevant)) – joop

Antwort

0

in C Casting kann verwirrend sein. Sie geben nicht die einzelnen Werte aus, Sie geben den Zeiger auf diese Werte. Was ist nicht was du willst.

Also sagen Sie gsl_fit_mul() - "hier ist ein Array von Doppel, nicht das Array von Ints, die der Compiler denkt." Aber sie wirklich sind Ints, so dass es nicht funktionieren wird.

Sie müssen ein zweites Array von Doubles erstellen und jedes Ints umwandeln, um Ihre Ints in Doubles umzuwandeln.

so:.

double* double_array1, *double_array2; 
size_t i; 

double_array1 = malloc(sizeof(double)*num); 
double_array2 = malloc(sizeof(double)*num); 
for (i=0; i < num; ++i) { 
    double_array1[i] = array1[i]; 
    double_array2[i] = array2[i]; 
} 


... 
gsl_fit_mul(double_array1 + ..., double_array2, ...) 
... 
free(double_array1); 
free(double_array2); 

(Seien Sie sicher, frei() auf diesen Arrays aufzurufen, nachdem Sie fertig Wenn Sie einen Maximalwert für num bei der Kompilierung bekannt ist, können diese Arrays statisch deklariert werden und Sie muss nicht malloc/free sie).

Auch ich kenne diese Bibliothek überhaupt nicht, aber ich bezweifle, dass der 'n' Parameter die Größe in Bytes der Eingabearrays sein sollte (was Sie erhalten, wenn Sie mit sizeof multiplizieren (uint64_t)). Übergeben Sie einfach die Anzahl der Elemente (num - minus Ihre Offset Magie).

+0

Ich habe den ursprünglichen Beitrag bearbeitet. Es funktioniert leider immer noch nicht. – Enzo