[MN-dev] [mndiff]: r133 - trunk/noe/ldpc.c
michael
subversion at mplayerhq.hu
Wed Apr 1 11:16:50 CEST 2009
Author: michael
Date: Wed Apr 1 11:16:50 2009
New Revision: 133
Log:
Perform gaussian elimination in 2 passes, first the lower left then the
upper right triangle, this is 30% faster in my tests.
Based on code by Yutaka Sawada | ten_fon A.T mail goo ne jp
Modified:
trunk/noe/ldpc.c
Modified: trunk/noe/ldpc.c
==============================================================================
--- trunk/noe/ldpc.c Sun Feb 1 14:26:10 2009 (r132)
+++ trunk/noe/ldpc.c Wed Apr 1 11:16:50 2009 (r133)
@@ -45,11 +45,11 @@ typedef uint8_t ELEM;
int inverse(ELEM *matrix, int width, int height, int solvew){
int i, j, k, m, p;
+ unsigned int logline[width];
for(p=i=0; i<solvew; i++){
for(j=p; j<height; j++){
if(matrix[i + j*width]){
- unsigned int logline[width];
unsigned int inve= EXT(log)[inv(matrix[i + j*width])];
for(m=i; m<width; m++){
ELEM t= matrix[m + j*width];
@@ -57,8 +57,8 @@ int inverse(ELEM *matrix, int width, int
matrix[m + p*width]= EXT(exp)[EXT(log)[t] + inve];
logline[m]= EXT(log)[matrix[m + p*width]];
}
- for(k=0; k<height; k++){
- if(matrix[i + k*width] && k!=p){
+ for(k=p+1; k<height; k++){ // eliminate lower left
+ if(matrix[i + k*width]){
unsigned int factor= EXT(log)[neg(matrix[i + k*width])];
for(m=i; m<width; m++)
matrix[m + k*width] = sum(matrix[m + k*width], EXT(exp)[logline[m] + factor]);
@@ -68,7 +68,17 @@ int inverse(ELEM *matrix, int width, int
break;
}
}
- fprintf(stderr, "%5d/%5d\r", i, width);
+ }
+ for(i=p-1; i>0; i--){
+ for(m=i; m<width; m++)
+ logline[m]= EXT(log)[matrix[m + i*width]];
+ for(k=0; k<i; k++){
+ if(matrix[i + k*width]){
+ unsigned int factor= EXT(log)[neg(matrix[i + k*width])];
+ for(m=i; m<width; m++)
+ matrix[m + k*width] = sum(matrix[m + k*width], EXT(exp)[logline[m] + factor]);
+ }
+ }
}
return p;
}
More information about the Mndiff-dev
mailing list