// Works great, you have to specify the number of elements though !
#include <math.h>
#include <stdio.h>
void concordant_discordant_rties_sties(float var1[], float var2[],
int* concordant, int* discordant, int* r_ties, int* s_ties);
double kendal_tau_cor(float var1[], float var2[]);
int main() {
float a[] = {6,6,4,6,8,6,8,4,4,6,6,8,8,8,8,8,8,4,4,4,4,8,8,8,8,4,4,4,8,6,8,4};
float b[] = {160.0,160.0,108.0,258.0,360.0,225.0,360.0,146.7,140.8,167.6,167.6,
275.8,275.8,275.8,472.0,460.0,440.0,78.7,75.7,71.1,120.1,318.0,304.0,
350.0,400.0,79.0,120.3,95.1,351.0,145.0,301.0,121.0};
printf("Value of kendall tau is: %.25lf \n", kendal_tau_cor(a,b));
return 0;
}
void concordant_discordant_rties_sties(float var1[], float var2[],
int* concordant, int* discordant, int* r_ties, int* s_ties) {
int i=0, j=0;
int m=0, n=0, o=0, p=0;
int number_of_elements= 32; //var1.elems;
while (i != (number_of_elements - 1)) {
j = i + 1;
while (j != number_of_elements) {
if (var1[j] > var1[i] && var2[j] > var2[i]) {
m+=1;
} else if (var1[j] < var1[i] && var2[j] < var2[i]) {
m+=1;
} else if (var1[j] > var1[i] && var2[j] < var2[i]) {
n+=1;
} else if (var1[j] < var1[i] && var2[j] > var2[i]) {
n+=1;
} else if (var1[j] == var1[i] && var2[j] != var2[i]) {
o+=1;
} else if (var1[j] != var1[i] && var2[j] == var2[i]) {
p+=1;
}
j+=1;
}
i+=1;
}
*concordant=m;
*discordant=n;
*r_ties=o;
*s_ties=p;
}
double kendal_tau_cor(float var1[], float var2[]) {
int q, r, s, t;
concordant_discordant_rties_sties(var1, var2, &q, &r, &s, &t);
return (q-r)/sqrt((q+r+s)*(q+r+t));
}