2015-11-02 3 views
0

Я пишу программу для вычисления коэффициента Пирсона в с, но у меня возникают некоторые проблемы, и я не уверен, что проблема есть, вот мой код:Pearson Расчет коэффициента массив

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 
#include <time.h> 

#define aSize 2000000 


double mean(double* mean_array){ 
    double mean = 0; 

    for (int i=0; i<aSize; i++){ 
     mean = mean + mean_array[i]; 
    } 


    mean = mean/aSize; 

    return mean; 

} 

double stan_dev_seq(double stan_array[], double stan_mean){ 

    double a = 0; 

    for (int i=0; i<aSize; i++){ 
     a = a + pow((stan_array[i]-stan_mean), 2); 
    } 

    a = a/aSize; 

    a = sqrt(a); 

    return a; 
} 

int pearson_seq(void){ 

    clock_t begin, end; 
    double time_spent; 

    begin = clock(); 

    double *a; 
    a = malloc(sizeof(double)*aSize); 


    double *b; 
    b = malloc(sizeof(double)*aSize); 

    double mean_a; 
    double mean_b; 

    for (int i=0; i<aSize; i++){ 
     a[i] = sin(i); 
     b[i] = sin(i+2);  

    } 

    mean_a = mean(a); 
    mean_b = mean(b); 



    double stan_dev_a = stan_dev_seq(a, mean_a); 
    double stan_dev_b = stan_dev_seq(b, mean_b); 

    double pearson_numer; 

    for(int i=0; i<aSize; i++){ 
     pearson_numer = pearson_numer + ((a[i]-mean_a)*(b[i]-mean_b)); 
    } 

    pearson_numer = pearson_numer/aSize; 

    double pearson_coef = pearson_numer/(stan_dev_a*stan_dev_b); 

    printf("%s %G\n", "The Pearson Coefficient is: ", pearson_coef); 

    end = clock(); 

    time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 


    printf("%f %s\n", end, "ms"); 
    printf("%f %s\n", begin, "ms"); 
    printf("%f %s\n", time_spent, "ms"); 



    free(a); 
    free(b); 

    return 0; 
} 

int main(void) { 

    pearson_seq(); 

return 0; 
} 

Если я запускаю программу, я получаю неправильное значение для коэффициента, а затем - seg fault, что для меня действительно не имеет смысла.

Если я печатаю размер массивов, я получаю значения, никак не связанные с размером массива.

Любая помощь будет оценена по достоинству.

+0

В дополнение к ошибке 'sizeof', вы должны изучить спецификаторы формата. Вам нужно '% zu' распечатать' size_t', тип результата 'sizeof', и я считаю, что ошибка seg возникает, когда вы пытаетесь напечатать' clock_t' с '% f'. (Предупреждения компилятора должны помочь вам обнаружить несоответствующие спецификации и аргументы формата.) –

+0

опубликованный код не скомпилирован! компилятор создает два заявления о проблемах: 'printf ("% f% s \ n ", end," ms ");' и один о 'printf ("% f% s \ n ", begin," ms "); '. При компиляции всегда включайте все предупреждения (для gcc, при минимальном использовании: '-Wall -Wextra -pedantic'), затем устанавливайте эти предупреждения. – user3629249

+0

Всегда проверяйте (! = NULL) возвращаемое значение из 'malloc()', чтобы убедиться, что операция прошла успешно. – user3629249

ответ

0
for (int i=0; i<sizeof(mean_array); i++){ 

Массивы распада к указателям при передаче в функцию, так sizeof(mean_array) эквивалентно sizeof(double), который не то, что вы хотите. Передайте размер массива в дополнительный аргумент функции.

+0

Привет, спасибо, я отредактировал свой код так, как показано выше, но я все еще получаю ошибку seg. – user2320239

+0

@ user2320239 Это не единственный случай неправильного использования переданных индексов массива. Исправьте остальных. – Magisch

0

Для меня авария происходит в заявлениях printf из-за использования %f для clock_t. Согласно ссылке here, для clock_t не может быть определенного модификатора. Вместо этого вы можете выбрать значение и распечатать, как показано ниже.

printf("%f %s\n", (float) end, "ms"); 
printf("%f %s\n", (float) begin, "ms");