#include #include #include /* Data types for matrices and vectors */ typedef char **matrix; typedef double *vector; /* Upon input of k, return H(k) */ matrix createHadMat ( unsigned int k ) { unsigned int i, j, s, t; matrix H; /* Allocate memory */ H = (char **)malloc((1 << k) * sizeof(char *)); for (i = 0; i < (1 << k); ++i) H[i] = (char *)malloc((1 << k) * sizeof(char)); /* Make a copy of H(0) */ H[0][0] = 1; t = 1; /* Iteratively populate H(1), H(2), ..., H(k) */ for (s=1; s<=k; ++s) { for (i=0; i> 1); w2 = HadMatVecProd(v + (n >> 1), n >> 1); w = (double *)malloc(n * sizeof(double)); /* H(k)v = ( H(k-1)v1 + H(k-1)v2, H(k-1)v1 - H(k-1)v2 ) */ for (i = 0; i < (n >> 1); ++i) { w[i] = w1[i] + w2[i]; w[(n >> 1) + i] = w1[i] - w2[i]; } /* Clean local dynamic memory */ free(w1); free(w2); } return w; } int main ( int argc, char *argv[] ) { unsigned int k, n; matrix H; vector v, w; /* Seed the random number generator with current time, so that we can get different random vectors v during different runs of the program. */ srand((unsigned int)time(NULL)); if (argc > 1) k = atoi(argv[1]); else { printf("k = "); scanf("%u", &k); } n = (1 << k); H = createHadMat(k); prnHadMat(H,k); v = genRandVec(n); printf("\nv = \n"); prnVec(v,n); w = matVecProd(H,v,n); printf("\n+++ Method 1\nHv = \n"); prnVec(w,n); free(w); freeMat(H,n); w = HadMatVecProd(v,n); printf("\n+++ Method 2\nHv = \n"); prnVec(w,n); free(w); exit(0); }