void saveMatrix(int *matrix, int rank, char **nomes, char *arquivo)
{
	FILE *f=fopen(arquivo, "wt+");
	char buffer[255];
	if (f!=NULL)
	{
		fprintf(f, "-------------------------------------------------------------------------------------------------------------------------------\n");
        fprintf(f, "|%20s|", "Nomes");
		for (int i=0;i<rank;i++) fprintf(f, "%20s|", nomes[i]);
        fprintf(f, "%20s|\n", "Acuracia");
		fprintf(f, "-------------------------------------------------------------------------------------------------------------------------------\n");

		for (int i=0;i<rank;i++) 
		{
			fprintf(f, "|%20s|", nomes[i]);
			int acc=0, total=0;
			for (int j=0;j<rank;j++)
			{
				fprintf(f, "%20d|", matrix[i*rank+j]);
				if (i==j) acc = matrix[i*rank+j];
				total += matrix[i*rank+j];

			}
			if (total == 0) sprintf(buffer, "%.2f", 0);
			else sprintf(buffer, "%.2f", (float)acc*100/(float)total);
			strcat(buffer, "%");
			fprintf(f, "%20s|\n", buffer);
		}

		fprintf(f, "-------------------------------------------------------------------------------------------------------------------------------\n");
		fprintf(f, "|%20s|", "Especificidade");

		for (int j=0;j<rank;j++)
		{
			int acc=0, total=0;
			for (int i=0;i<rank;i++)
			{
				if (i==j) acc = matrix[i*rank+j];
				total += matrix[i*rank+j];
			}
			if (total == 0) sprintf(buffer, "%.2f", 0);
			else sprintf(buffer, "%.2f", (float)acc*100/(float)total);
			strcat(buffer, "%");
			fprintf(f, "%20s|", buffer);
		}
        fprintf(f, "%20s|\n", "");
		fprintf(f, "-------------------------------------------------------------------------------------------------------------------------------\n");
		fprintf(f, "\n");

		sprintf(buffer, "%.2f", acertos(matrix, rank));
		strcat(buffer, "%");

		fprintf(f, "Valor Kappa    : %.2f\n", Kappa(matrix, rank));
		fprintf(f, "Acurácia Geral : %s\n", buffer);
		fprintf(f, "Total Exemplos : %d\n", exemplos(matrix, rank));
		fclose(f);
	}
}
bool ClassificadorAdaboostM1::executarClassificacao( Corpus &corpusProva, int atributo ) {
    vector<vector<double> > exemplos(corpusProva.pegarQtdTotalExemplos(), vector<double>(valores.size(), 0.0));
    int k, indice;
    for (unsigned int t = 0; t < classificadores.size(); t++) {
        (classificadores[t])->executarClassificacao(corpusProva, atributo);
        k = 0;
        for (int i = 0; i < corpusProva.pegarQtdSentencas(); i++) {
            for (int j = 0; j < corpusProva.pegarQtdExemplos(i); j++) {
                indice = -1;
                for (unsigned int a = 0; a < valores.size() - 1; a++)
                    if (valores[a] == corpusProva(i, j, atributo)) {
                        indice = a;
                        a = valores.size();
                    }
                if (indice == -1)
                    indice = valores.size() - 1;
                exemplos[k][indice] -= log(betas[t]);
                k++;
            }
        }
    }
    double maxBeta; int maxAtr;
    k = 0;
    for (int i = 0; i < corpusProva.pegarQtdSentencas(); i++) {
        for (int j = 0; j < corpusProva.pegarQtdExemplos(i); j++) {
            maxBeta = exemplos[k][valores.size()-1];
            maxAtr = valores.size() - 1;
            for (unsigned int a = 0; a < valores.size() - 1; a++) {
                if (maxBeta <= exemplos[k][a]) {
                    maxBeta = exemplos[k][a];
                    maxAtr = a;
                }
            }
            corpusProva(i, j, atributo, valores[maxAtr]);
            k++;
        }
    }
    return true;
}