Я пишу программу для вычисления коэффициента Пирсона в с, но у меня возникают некоторые проблемы, и я не уверен, что проблема есть, вот мой код: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, что для меня действительно не имеет смысла.
Если я печатаю размер массивов, я получаю значения, никак не связанные с размером массива.
Любая помощь будет оценена по достоинству.
В дополнение к ошибке 'sizeof', вы должны изучить спецификаторы формата. Вам нужно '% zu' распечатать' size_t', тип результата 'sizeof', и я считаю, что ошибка seg возникает, когда вы пытаетесь напечатать' clock_t' с '% f'. (Предупреждения компилятора должны помочь вам обнаружить несоответствующие спецификации и аргументы формата.) –
опубликованный код не скомпилирован! компилятор создает два заявления о проблемах: 'printf ("% f% s \ n ", end," ms ");' и один о 'printf ("% f% s \ n ", begin," ms "); '. При компиляции всегда включайте все предупреждения (для gcc, при минимальном использовании: '-Wall -Wextra -pedantic'), затем устанавливайте эти предупреждения. – user3629249
Всегда проверяйте (! = NULL) возвращаемое значение из 'malloc()', чтобы убедиться, что операция прошла успешно. – user3629249