[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 */