[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
## Re: efficiently modifying a 0-1 matrix for a fixed row sum

**From**: |
Andy Buckle |

**Subject**: |
Re: efficiently modifying a 0-1 matrix for a fixed row sum |

**Date**: |
Tue, 7 Sep 2010 16:18:37 +0100 |

On Tue, Sep 7, 2010 at 4:35 AM, Mike B. <address@hidden> wrote:
>* Hi All,*
>
>* I have a matrix of 0-1 elements which are randomly distributed.*
>
>* I need to modify the matrix such that each row has exacly the same sum, for *
>* example, assuming the target sum is 2 and the initial matrix is*
>* 0 1 0 (sum=0, too low)*
>* 1 1 1 (sum=3, too high)*
>
>* one possible outcome is*
>* 1 1 0 (sum=2)*
>* 1 0 1 (sum=2)*
>
>* Any way to avoid slow for loops?.*
>
>* Thanks,*
>* Mike.*
>
This does use a loop...
The number of iterations seems to be independent of the length of the
vector (but I have not scratched my head long enough over the stats to
see if that is definitely the case).
This is quite ugly code. I wait eagerly to see who can do better.
bvl=100;
reqsum=round(0.2*bvl);
printf("required sum: %i\n",reqsum);
bv=round(rand(1,bvl));
s=sum(bv);
printf("initial sum: %i\n",s);
while abs(extra=reqsum-sum(bv)) >0.1
s=sum(bv)
if extra>0.1 % need more ones
spaces=bvl-s;
ev=(rand(1,spaces)<(extra/spaces));
bv(~logical(bv))=ev;
elseif extra<-0.1% more zeros
spaces=s;
ev=(rand(1,spaces)<(-extra/spaces));
bv(logical(bv))=~ev;
end
end
s=sum(bv);
printf("final sum: %i\n",reqsum);
--
/* andy buckle */