<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255206</link>
    <title>MATLAB Central Newsreader - randsample bug?</title>
    <description>Feed for thread: randsample bug?</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Thu, 02 Jul 2009 18:27:13 -0400</pubDate>
      <title>randsample bug?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255206#662310</link>
      <author>MZ</author>
      <description>I may have found a bug in randsample.  Can anyone suggest a workaround?&lt;br&gt;
&lt;br&gt;
I'm calling it with:&lt;br&gt;
&lt;br&gt;
randsample(vals,10^5,true,w);&lt;br&gt;
&lt;br&gt;
vals is the data set I'm sampling from.  w is a weighting function. &lt;br&gt;
Some of the elements of w are equal to zero.&lt;br&gt;
&lt;br&gt;
Occasionally I get an error:&lt;br&gt;
&lt;br&gt;
&quot;??? Subscript indices must either be real positive integers or &lt;br&gt;
logicals.&quot;&lt;br&gt;
&lt;br&gt;
And it points to the line of code in randsample.m that reads:&lt;br&gt;
&lt;br&gt;
y = population(y);&lt;br&gt;
&lt;br&gt;
I checked, and apparently y is equal to 0 for one or two of the 10^5 &lt;br&gt;
values in y.  Where does y come from?&lt;br&gt;
&lt;br&gt;
[dum, y] = histc(rand(k,1),[0 cumsum(p)]);&lt;br&gt;
&lt;br&gt;
where p is the normalized weighting array.&lt;br&gt;
&lt;br&gt;
That means that histc is returning 0 in y every so often, indicating &lt;br&gt;
that the rand function is out of range.  But rand is supposed to return &lt;br&gt;
(0,1), right?  So that means that the cumsum(p) part is not going from 0 &lt;br&gt;
to 1?  In fact, when I ask it if max(cumsum(p))&amp;gt;1, it returns true. &lt;br&gt;
Seems the opposite of what I was expecting.&lt;br&gt;
&lt;br&gt;
So, I'm completely confused now.</description>
    </item>
    <item>
      <pubDate>Thu, 02 Jul 2009 22:15:03 -0400</pubDate>
      <title>Re: randsample bug?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255206#662396</link>
      <author>Peter Perkins</author>
      <description>MZ, I'm not able to reproduce this, but then I don't have the weights that you're using.  I'd be ahppy to look into this.  Is the population small enough that you could post the weights, as format long g?  Or perhaps send them directly to me?  The population itself doesn't really matter.&lt;br&gt;
&lt;br&gt;
Thanks.&lt;br&gt;
&lt;br&gt;
- Peter Perkins&lt;br&gt;
&amp;nbsp;&amp;nbsp;The MathWorks, Inc.&lt;br&gt;
&lt;br&gt;
MZ wrote:&lt;br&gt;
&amp;gt; I may have found a bug in randsample.  Can anyone suggest a workaround?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I'm calling it with:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; randsample(vals,10^5,true,w);&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; vals is the data set I'm sampling from.  w is a weighting function. Some &lt;br&gt;
&amp;gt; of the elements of w are equal to zero.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Occasionally I get an error:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &quot;??? Subscript indices must either be real positive integers or logicals.&quot;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; And it points to the line of code in randsample.m that reads:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; y = population(y);&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I checked, and apparently y is equal to 0 for one or two of the 10^5 &lt;br&gt;
&amp;gt; values in y.  Where does y come from?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; [dum, y] = histc(rand(k,1),[0 cumsum(p)]);&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; where p is the normalized weighting array.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; That means that histc is returning 0 in y every so often, indicating &lt;br&gt;
&amp;gt; that the rand function is out of range.  But rand is supposed to return &lt;br&gt;
&amp;gt; (0,1), right?  So that means that the cumsum(p) part is not going from 0 &lt;br&gt;
&amp;gt; to 1?  In fact, when I ask it if max(cumsum(p))&amp;gt;1, it returns true. &lt;br&gt;
&amp;gt; Seems the opposite of what I was expecting.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; So, I'm completely confused now.</description>
    </item>
    <item>
      <pubDate>Fri, 03 Jul 2009 20:57:42 -0400</pubDate>
      <title>Re: randsample bug?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255206#662554</link>
      <author>MZ</author>
      <description>Peter Perkins wrote:&lt;br&gt;
&amp;gt; MZ, I'm not able to reproduce this, but then I don't have the weights &lt;br&gt;
&amp;gt; that you're using.  I'd be ahppy to look into this.  Is the population &lt;br&gt;
&amp;gt; small enough that you could post the weights, as format long g?  Or &lt;br&gt;
&amp;gt; perhaps send them directly to me?  The population itself doesn't really &lt;br&gt;
&amp;gt; matter.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Thanks.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; - Peter Perkins&lt;br&gt;
&amp;gt;  The MathWorks, Inc.&lt;br&gt;
&lt;br&gt;
Peter, my weighting function is fairly long.  2001 elements.  I can send &lt;br&gt;
it to you (as a .mat file?) if you give me an email address.&lt;br&gt;
&lt;br&gt;
Anyway, I think I identified the problem.&lt;br&gt;
&lt;br&gt;
Line 54: p = w(:)' / sum(w);&lt;br&gt;
&lt;br&gt;
This normalizes the weighting function and puts it in p.  Then, later on &lt;br&gt;
(line 65?), cumsum(p) is used as a histc bin argument.  One would think, &lt;br&gt;
then, that max(cumsum(p))==1 should return true...  but it doesn't.  So &lt;br&gt;
my workaround was to replace that histc line with...&lt;br&gt;
&lt;br&gt;
cp = cumsum(p);&lt;br&gt;
cp = cp / max(cp);&lt;br&gt;
[dum, y] = histc(rand(k,1),[0 cp]);&lt;br&gt;
&lt;br&gt;
I'm normalizing the cumsum(p) element.  It shouldn't NEED normalization &lt;br&gt;
since p was normalized.  But for some reason it does.  Now it works &lt;br&gt;
every time.&lt;br&gt;
&lt;br&gt;
Also, if it helps, I'm using single not double precision for everything.</description>
    </item>
    <item>
      <pubDate>Mon, 06 Jul 2009 16:04:03 -0400</pubDate>
      <title>Re: randsample bug?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255206#662962</link>
      <author>Peter Perkins</author>
      <description>MZ wrote:&lt;br&gt;
&lt;br&gt;
&amp;gt; &amp;gt; Peter, my weighting function is fairly long.  2001 elements.  I can send &lt;br&gt;
&amp;gt; &amp;gt; it to you (as a .mat file?) if you give me an email address.&lt;br&gt;
&lt;br&gt;
Yes, I would be interested to see that, to confirm my suspicions.  A mat file would be best, if possible.  My address is as in the msg header, with obvious modification.&lt;br&gt;
&lt;br&gt;
&amp;gt; &amp;gt; I'm normalizing the cumsum(p) element.  It shouldn't NEED normalization &lt;br&gt;
&amp;gt; &amp;gt; since p was normalized.  But for some reason it does.  Now it works &lt;br&gt;
&amp;gt; &amp;gt; every time.&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Also, if it helps, I'm using single not double precision for everything.&lt;br&gt;
&lt;br&gt;
Well, that's accumulated round-off error.  Single precision makes it a whole lot easier to run into.  What I'm confused about is that you said&lt;br&gt;
&lt;br&gt;
&amp;gt; &amp;gt; In fact, when I ask it if max(cumsum(p))&amp;gt;1, it returns true.&lt;br&gt;
&lt;br&gt;
and that would not seem to cause the problem you saw (perhaps you meant &quot;&amp;lt;&quot;?).  In any case, thanks for pointing this out, and thanks in advance for sending those weights.&lt;br&gt;
&lt;br&gt;
- Peter Perkins&lt;br&gt;
&amp;nbsp;&amp;nbsp;The MathWorks, Inc.</description>
    </item>
    <item>
      <pubDate>Mon, 14 Jun 2010 19:25:22 -0400</pubDate>
      <title>Re: randsample bug?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255206#754357</link>
      <author>Daniel </author>
      <description>Peter Perkins &amp;lt;Peter.Perkins@MathRemoveThisWorks.com&amp;gt; wrote in message &amp;lt;h2t79j$1s$2@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; MZ wrote:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Peter, my weighting function is fairly long.  2001 elements.  I can send &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; it to you (as a .mat file?) if you give me an email address.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Yes, I would be interested to see that, to confirm my suspicions.  A mat file would be best, if possible.  My address is as in the msg header, with obvious modification.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; I'm normalizing the cumsum(p) element.  It shouldn't NEED normalization &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; since p was normalized.  But for some reason it does.  Now it works &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; every time.&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Also, if it helps, I'm using single not double precision for everything.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Well, that's accumulated round-off error.  Single precision makes it a whole lot easier to run into.  What I'm confused about is that you said&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; In fact, when I ask it if max(cumsum(p))&amp;gt;1, it returns true.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; and that would not seem to cause the problem you saw (perhaps you meant &quot;&amp;lt;&quot;?).  In any case, thanks for pointing this out, and thanks in advance for sending those weights.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; - Peter Perkins&lt;br&gt;
&amp;gt;   The MathWorks, Inc.&lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
I have come across this problem as well in R2009b. I have replicated the problem as follows:&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; w=[rand(1,20).*(10.^(-1:-1:-20))];&lt;br&gt;
&amp;gt;&amp;gt; w'&lt;br&gt;
&lt;br&gt;
ans =&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5.107718317110735e-02&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9.035816954336645e-03&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5.019622603074214e-05&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5.082034411944370e-06&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6.672176771896132e-06&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.056483301112950e-07&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.847443517874017e-08&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.330449395779038e-09&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.409516966699802e-10&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7.536455578748046e-11&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.252848495157920e-12&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.836686939640874e-13&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.099073689710823e-14&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7.433976002934081e-15&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.534970427278192e-16&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.603071891483976e-17&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.871715469932097e-18&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8.429440789615370e-19&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7.805564204060190e-20&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6.260292404284273e-21&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; p = w/sum(w);&lt;br&gt;
&amp;gt;&amp;gt; e = [0 cumsum(p)];&lt;br&gt;
&amp;gt;&amp;gt; e(end) = 1;&lt;br&gt;
&amp;gt;&amp;gt; diff(e(end-5:end))'&lt;br&gt;
&lt;br&gt;
ans =&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.220446049250313e-16&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-2.220446049250313e-16&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; max(cumsum(p(1:end-1)))&amp;gt;1&lt;br&gt;
&lt;br&gt;
ans =&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;br&gt;
&lt;br&gt;
The last line shows that by making the last element in &quot;e&quot; equal to 1 (as is done in randsample.m for the edges) creates a vector that is not &quot;monotonically non-decreasing&quot; as required by histc:&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; randsample(20,20,true,w);&lt;br&gt;
&lt;br&gt;
??? Error using ==&amp;gt; histc&lt;br&gt;
Edge vector must be monotonically non-decreasing.&lt;br&gt;
&lt;br&gt;
Error in ==&amp;gt; randsample at 101&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[~, y] = histc(rand(k,1),edges);&lt;br&gt;
&amp;nbsp;&lt;br&gt;
101                 [~, y] = histc(rand(k,1),edges);&lt;br&gt;
&lt;br&gt;
By setting edges(end) = 1, it seems that there is an assumption that the round-off accumulation occurs in the the last element of the weight vector (and not earlier in the vector as in the example above).&lt;br&gt;
&lt;br&gt;
--Danny Dunlavy </description>
    </item>
    <item>
      <pubDate>Mon, 14 Jun 2010 20:15:00 -0400</pubDate>
      <title>Re: randsample bug?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/255206#754370</link>
      <author>Peter Perkins</author>
      <description>On 6/14/2010 3:25 PM, Daniel wrote:&lt;br&gt;
&lt;br&gt;
&amp;gt; I have come across this problem as well in R2009b. I have replicated the&lt;br&gt;
&amp;gt; problem as follows:&lt;br&gt;
&lt;br&gt;
Daniel, you are right.  It has been fixed in R2010a, though for some &lt;br&gt;
reason there was not a published bug report up on the web.  I will try &lt;br&gt;
to get one posted as soon as possible.  A work-around for your case &lt;br&gt;
seems to be to compute&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = w/sum(w);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = min([0 cumsum(p)],1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e(end) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = diff(e);&lt;br&gt;
&lt;br&gt;
from the original weights, and pass that p into randsample.  You can &lt;br&gt;
also modify RANDSAMPLE itself if you have permissions for your &lt;br&gt;
installation -- the mod is just the second line above.  Hope this helps.</description>
    </item>
  </channel>
</rss>

