我正在编写这个程序,用于C语言中的K_均值聚类,以及在Linux中的GCC编译器上编译该程序 编译器错误按摩如下
***/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status***
我的完整计划正在关注
#include <stdlib.h>
#include <assert.h>
#include <float.h>
#include <math.h>
int *k_means(double **data, int n, int m, int k, double t, double
**centroids) { /* output cluster label for each data point */ int *labels = (int*)calloc(n, sizeof(int));
int h, i, j; /* loop counters, of course :) */ int *counts =
(int*)calloc(k, sizeof(int)); /* size of each cluster */ double
old_error, error = DBL_MAX; /* sum of squared euclidean distance */
double **c = centroids ? centroids : (double**)calloc(k,
sizeof(double*)); double **c1 = (double**)calloc(k,
sizeof(double*)); /* temp centroids */
assert(data && k > 0 && k <= n && m > 0 && t >= 0); /* for
debugging */
/**** ** initialization */
for (h = i = 0; i < k; h += n / k, i++) {
c1[i] = (double*)calloc(m, sizeof(double));
if (!centroids) {
c[i] = (double*)calloc(m, sizeof(double));
}
/* pick k points as initial centroids */
for (j = m; j-- > 0; c[i][j] = data[h][j]); }
/**** ** main loop */
do {
/* save error from last step */
old_error = error, error = 0;
/* clear old counts and temp centroids */
for (i = 0; i < k; counts[i++] = 0) {
for (j = 0; j < m; c1[i][j++] = 0);
}
for (h = 0; h < n; h++) {
/* identify the closest cluster */
double min_distance = DBL_MAX;
for (i = 0; i < k; i++) {
double distance = 0;
for (j = m; j-- > 0; distance += pow(data[h][j] - c[i][j], 2));
if (distance < min_distance) {
labels[h] = i;
min_distance = distance;
}
}
/* update size and temp centroid of the destination cluster */
for (j = m; j-- > 0; c1[labels[h]][j] += data[h][j]);
counts[labels[h]]++;
/* update standard error */
error += min_distance;
}
for (i = 0; i < k; i++) { /* update all centroids */
for (j = 0; j < m; j++) {
c[i][j] = counts[i] ? c1[i][j] / counts[i] : c1[i][j];
}
}
} while (fabs(error - old_error) > t);
/**** ** housekeeping */
for (i = 0; i < k; i++) {
if (!centroids) {
free(c[i]);
}
free(c1[i]); }
if (!centroids) {
free(c); } free(c1);
free(counts);
return labels; }
请帮助我们。
#include <stdlib.h>
#include <assert.h>
#include <float.h>
#include <math.h>
int *k_means(double **data, int n, int m, int k, double t, double
**centroids) { /* output cluster label for each data point */ int *labels = (int*)calloc(n, sizeof(int));
int h, i, j; /* loop counters, of course :) */ int *counts =
(int*)calloc(k, sizeof(int)); /* size of each cluster */ double
old_error, error = DBL_MAX; /* sum of squared euclidean distance */
double **c = centroids ? centroids : (double**)calloc(k,
sizeof(double*)); double **c1 = (double**)calloc(k,
sizeof(double*)); /* temp centroids */
assert(data && k > 0 && k <= n && m > 0 && t >= 0); /* for
debugging */
/**** ** initialization */
for (h = i = 0; i < k; h += n / k, i++) {
c1[i] = (double*)calloc(m, sizeof(double));
if (!centroids) {
c[i] = (double*)calloc(m, sizeof(double));
}
/* pick k points as initial centroids */
for (j = m; j-- > 0; c[i][j] = data[h][j]); }
/**** ** main loop */
do {
/* save error from last step */
old_error = error, error = 0;
/* clear old counts and temp centroids */
for (i = 0; i < k; counts[i++] = 0) {
for (j = 0; j < m; c1[i][j++] = 0);
}
for (h = 0; h < n; h++) {
/* identify the closest cluster */
double min_distance = DBL_MAX;
for (i = 0; i < k; i++) {
double distance = 0;
for (j = m; j-- > 0; distance += pow(data[h][j] - c[i][j], 2));
if (distance < min_distance) {
labels[h] = i;
min_distance = distance;
}
}
/* update size and temp centroid of the destination cluster */
for (j = m; j-- > 0; c1[labels[h]][j] += data[h][j]);
counts[labels[h]]++;
/* update standard error */
error += min_distance;
}
for (i = 0; i < k; i++) { /* update all centroids */
for (j = 0; j < m; j++) {
c[i][j] = counts[i] ? c1[i][j] / counts[i] : c1[i][j];
}
}
} while (fabs(error - old_error) > t);
/**** ** housekeeping */
for (i = 0; i < k; i++) {
if (!centroids) {
free(c[i]);
}
free(c1[i]); }
if (!centroids) {
free(c); } free(c1);
free(counts);
return labels; }
答案 0 :(得分:4)
如果您保留整个代码的代码格式,而不仅仅是它的部分,那么它将更具可读性。
但是当我试图找到一个主要功能时,我没有找到任何功能。因此没有对main的引用,因为你没有实现一个,至少在你发布的代码中没有实现。