Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: Binary Vector Manipulation

  • To: mathgroup at smc.vnet.net
  • Subject: [mg84167] Re: [mg84112] Re: Binary Vector Manipulation
  • From: DrMajorBob <drmajorbob at bigfoot.com>
  • Date: Wed, 12 Dec 2007 05:12:15 -0500 (EST)
  • References: <fjj183$frv$1@smc.vnet.net> <27344701.1197389547252.JavaMail.root@m35>
  • Reply-to: drmajorbob at bigfoot.com

Brilliant!

That has linear complexity (apparently) and, for n=10^6, it's 30 times 
faster than my solution.

I rewrote it to eliminate a Total, but it hardly mattered:

muench[a_, b_] := Block[{newB = Clip[a + b], posns},
   posns = Position[Normal@newB, 1];
   ReplacePart[newB, RandomSample[posns, Length@posns - Total@b] -> 0]]

Bobby

On Mon, 10 Dec 2007 19:39:28 -0600, thomas <thomas.muench at gmail.com> wrote:

> One of several possibilities is
>
> With[{newB = Clip[vectorA + vectorB]},
>  ReplacePart[newB,
>   RandomSample[Position[Normal@newB, 1], Total[newB] - Total[vectorB]]
> ->
>    0]]
>
> where newB is your new vector with "more than 50%" 1's. It is achieved
> by adding vectorA and vectorB, yielding some "2" entries where the "1"
> entries between A and b overlapped. Clip[...] corrects for that.
>
> In the second part you randomly replace the appropriate number of 1's
> with 0's. You get this number with Total[newB] - Total[vectorB], which
> is the number of excess 1's in newB. You need the "Normal@" in
> "Position[Normal@newB, 1]" only if your original vectors were
> SparseArrays, because Position doesn't work with SparseArrays.
>
> another option [maybe faster, depending on the size of your vectors]:
>
> SparseArray[
>  RandomSample[
>    SparseArray@Clip[vectorA + vectorB]/.
>     SparseArray[_, _, _, p_] :> Flatten@p[[2, 2]], Total[vectorB]] ->
>   Table[1, {Total[vectorB]}]]
>
>
> Hope that helps,
> Thomas
>
> On Dec 10, 10:34 am, Tara.Ann.Lor... at gmail.com wrote:
>> I am need of assistance programming the following scenario:
>>
>> I have two vectors composed of 0's and 1's.  Vector "A" has 5% 1's
>> (and 95% 0's) while Vector "B" has 50% 1's and 50% 0's.
>>
>> First, I would like to change Vector B to have a "1" in every place
>> that Vector A also has a "1" (in other words, I will then have more
>> than 50% 1's in Vector B once this step is completed).
>>
>> Then, I would like to *randomly* return Vector B back to a 50/50
>> distribution of 1's and 0's.
>>
>> I greatly appreciate any proposed programming methods.
>>
>> Thank you,
>> Tara
>
>



-- 

DrMajorBob at bigfoot.com


  • Prev by Date: Re: question about For
  • Next by Date: Re: Plotting of Sin(x)/x
  • Previous by thread: Re: Re: Binary Vector Manipulation
  • Next by thread: Monitor bug or feature