#include #include #include const int K=2; const int N=2; const int Q=2; const int W=2; //const int m=N*Q+W-1; //const int n=K*N; // can't do the above in c, calculate // by hand. const int m=5; const int n=4; void Decode(float C[Q][K], float h[W][K], float *r); void AddSigma(int n,float sigma,float AhA[K*N][K*N],float AhAsig[K*N][K*N]); void MatchFilt(int m, int n, float *r, float *Ahr, float A[Q*N+W-1][K*N]); void SelfMult(int m, int n,float A[Q*N+W-1][K*N],float AhA[K*N][K*N]); void Forw(int n, float *Ahr, float *u, float L[K*N][K*N]); void Backs(int n, float *v, float *u, float L[K*N][K*N]); void CompSigma(int n, float *sigma, float *a, float *b); void DelMat(float B[Q+W-1][K], float A[Q*N+W-1][K*N]); void chold(float A[Q*N+W-1][K*N],float L[K*N][K*N],int n); void ConvMat(float C[Q][K], float B[Q+W-1][K], float h[W][K]); void PrintD(int n, float *d); void Print2D(int m,int n, float Mat[n][n]); /** Main loop -- run this multiple times to get numbers **/ doDecode() { // int K; // int N; // int Q; // int W; // K=2; // N=2; // Q=2; // W=2; float h[W][K]; float C[Q][K]; float r[Q*N+W-1]; int i,j; float sum=0; for (i=0;i=0;i--){ sum=0; for (j=i+1;j=0;k--) sum -= L[i][k]*L[j][k]; if (i==j) { L[j][i]=sqrt(sum); } else { L[j][i]=sum/L[i][i]; L[i][j]=0; } } } }