Skip to content
Snippets Groups Projects
Commit c1b58b79 authored by Nico Ramos's avatar Nico Ramos
Browse files

ta uma merda

parent 41ad0125
Branches main
No related tags found
No related merge requests found
*.o
lixo
CC = gcc
CC = gcc -lm
CFLAGS = -g -Wall
kmeans: main.o kmeans.o utils.o pontos.o
$(CC) main.o kmeans.o utils.o pontos.o -o kmeans -lm
*.o: *.c
$(CC) $(CFLAGS) -c *.c
clean:
rm *.o
rm *.o 2>/dev/null
purge: clean
rm kmeans *.swp vgcore*
rm kmeans
No preview for this file type
......@@ -21,40 +21,22 @@ double **calc_mi(double **pontos, int *comb, int k, int tam, int dim_p)
double **mi;
/* Aloca o vetor para as medias */
if ( ! (mi = malloc(sizeof(double *) * k)) )
return NULL;
if ( ! (mi = malloc(sizeof(double *) * k)) ) { return NULL; }
/* Aloca os vetores com o valor para cada coordenada */
for ( int i = 0; i < k; i++ )
{
if ( ! (mi[i] = malloc(sizeof(double) * dim_p)) )
return NULL;
/* Se alocou zera o vetor */
else
for ( int j = 0; j < dim_p; j++ )
mi[i][j] = 0;
}
if ( ! (mi[i] = calloc(dim_p, sizeof(double))) ) { return NULL; }
/* Aloca o vetor com a quantidade de pontos em cada cluster */
if ( ! (qtd = malloc(sizeof(int) * k)) )
return NULL;
else
{
/* Se alocou, inicia o vetor em 0 */
for ( int i = 0; i < k; i++ )
qtd[i] = 0;
}
if ( ! (qtd = calloc(k, sizeof(int))) ) { return NULL; }
/* Calcula a soma das coordenadas para cada cluster */
for ( int i = 0; i < tam; i++ )
{
/* Soma as coordenadas */
for ( int j = 0; j < dim_p; j++ )
{
mi[comb[i]][j] += pontos[i][j];
qtd[comb[i]]++;
}
qtd[comb[i]]++;
}
/* Divide a soma das coordenadas de cada cluster pela quantidade de pontos */
......@@ -79,13 +61,10 @@ double kmeans(double **pontos, int *comb, int tam, int k, int dim_p)
/* Calcula a soma das normas de cada cluster */
for ( int i = 0; i < k; i++ )
{
/* Calcula a soma das normas de cada ponto no cluster i */
/* Calcula a norma se o ponto pertence ao cluster i */
for ( int j = 0; j < tam; j++ )
{
/* Checa se o ponto pertence ao cluster i */
if ( comb[j] == i )
f +=norma(pontos[j], mi[i], dim_p);
}
}
for ( int i = 0; i < dim_p; i++ )
......
......@@ -5,18 +5,11 @@
#include "utils.h"
#include "pontos.h"
#include "kmeans.h"
#define P_MAX 100 /* Maior valor para as coordenadas */
#define P_MIN 0 /* Menor valor para as coordenadas */
#define QTD_P 10 /* Quantidade de pontos */
#define DIM_P 3 /* Dimensao dos pontos */
#define K 2 /* Quantidade de clusters */
int main()
{
int **v_comb;
double **v_pontos, f;
double **v_pontos;
srand(time(0));
......@@ -26,38 +19,8 @@ int main()
/* Gera todas as combinações de divisao dos pontos nos clusters */
v_comb = geraVetorComb(K, QTD_P);
/* Imprime todos os pontos */
printf("\n---------------------Pontos--------------------\n\n");
/* Imprime cabecalho */
printf(" Coordenadas\n");
printf(" Ponto |");
for ( int i = 0; i < DIM_P; i++ )
printf(" %d |", i);
printf("\n");
/* Imprime as coordenadas de cada ponto */
for ( int i = 0; i < QTD_P; i++ )
{
printf(" %d |", i);
imprimeVetorDouble(v_pontos[i], DIM_P);
}
printf("\n---------------------Kmeans--------------------\n\n");
/* Imprime o cabecalho */
printf(" Comb | Pontos | F |\n");
/* Calcula e imprime a funcao f para todas as combinacoes */
for ( int i = 0; i < pow(K, QTD_P); i++ )
{
printf(" %4d |", i);
imprimeVetorInt(v_comb[i], QTD_P);
f = kmeans(v_pontos, v_comb[i], K, QTD_P, DIM_P);
printf(" %9f |\n", f);
}
printf("\n");
imprime(v_comb, v_pontos);
encerra(v_pontos, v_comb, QTD_P, QTD_P);
return 0;
}
......@@ -3,6 +3,7 @@
#include <math.h>
#include "utils.h"
#include "kmeans.h"
double alet(double min, double max)
{
......@@ -49,4 +50,38 @@ void encerra(double **v_pontos, int **v_bin, int qtd, int dim)
free(v_bin);
}
// Imprime todas as combinações e o valor da funcao
void imprime(int **v_comb, double **v_pontos)
{
/* Imprime todos os pontos */
printf("\n---------------------Pontos--------------------\n\n");
/* Imprime cabecalho */
printf(" Coordenadas\n");
printf(" Ponto |");
for ( int i = 0; i < DIM_P; i++ )
printf(" %d |", i);
printf("\n");
/* Imprime as coordenadas de cada ponto */
for ( int i = 0; i < QTD_P; i++ )
{
printf(" %d |", i);
imprimeVetorDouble(v_pontos[i], DIM_P);
}
printf("\n---------------------Kmeans--------------------\n\n");
/* Imprime o cabecalho */
printf(" Comb | Pontos | F |\n");
/* Calcula e imprime a funcao f para todas as combinacoes */
for ( int i = 0; i < pow(K, QTD_P); i++ )
{
printf("%4d |", i);
imprimeVetorInt(v_comb[i], QTD_P);
double f = kmeans(v_pontos, v_comb[i], K, QTD_P, DIM_P);
printf(" %9f |\n", f);
}
printf("\n");
}
#ifndef _UTILS_
#define _UTILS_
#define P_MAX 100 /* Maior valor para as coordenadas */
#define P_MIN 1 /* Menor valor para as coordenadas */
#define QTD_P 8 /* Quantidade de pontos */
#define DIM_P 3 /* Dimensao dos pontos */
#define K 3 /* Quantidade de clusters */
/* Retorna um double entre min e max */
double alet(double min, double max);
void imprimeVetorDouble(double *v, int tam);
void imprimeVetorInt(int *v, int tam);
void copiaVetor(int *a, int *b, int tam);
void encerra(double **v_pontos, int **v_bin, int qtd, int dim);
// Imprime todas as combinações e o valor da funcao
void imprime(int **v_comb, double **v_pontos);
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment