<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/249721</link>
    <title>MATLAB Central Newsreader - filtering data problem</title>
    <description>Feed for thread: filtering data problem</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, 23 Apr 2009 00:16:01 -0400</pubDate>
      <title>filtering data problem</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/249721#644787</link>
      <author>Mike</author>
      <description>Hi&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I usually need to filter data.  Sometimes I use logical-indexing, but I found there are many temporary arrays I created.  Does that way waste memory?  How to avoid this?&lt;br&gt;
&lt;br&gt;
Mike</description>
    </item>
    <item>
      <pubDate>Thu, 23 Apr 2009 06:30:07 -0400</pubDate>
      <title>Re: filtering data problem</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/249721#644817</link>
      <author>Jos </author>
      <description>&quot;Mike &quot; &amp;lt;sulfateion@gmail.com&amp;gt; wrote in message &amp;lt;gsoc01$eog$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Hi&lt;br&gt;
&amp;gt;     I usually need to filter data.  Sometimes I use logical-indexing, but I found there are many temporary arrays I created.  Does that way waste memory?  How to avoid this?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Mike&lt;br&gt;
&lt;br&gt;
Logical indexing is very powerful but indeed creates a (temporary) array. However, they use 1/8 of the memory occupied by  double array of the same size:&lt;br&gt;
A = rand(100,1) ; B = A &amp;gt; 0.5 ; whos&lt;br&gt;
&lt;br&gt;
You can clear out, or overwrite, any variables you no longer need:&lt;br&gt;
A = rand(10,1) ;&lt;br&gt;
q = A &amp;gt; 0.5 ;&lt;br&gt;
A = A(q) ; % overwrite&lt;br&gt;
clear q ;&lt;br&gt;
&lt;br&gt;
If this is not an option, you can turn to very inefficient loops, like this one, which does not occupy (a lot of) additional memory ... &lt;br&gt;
&lt;br&gt;
A = rand(10,1) ;&lt;br&gt;
idx = 1 ;&lt;br&gt;
while (idx &amp;lt;= numel(A)),&lt;br&gt;
&amp;nbsp;&amp;nbsp;if A(idx) &amp;gt; 0.5,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;idx = idx + 1 ; % goto next element&lt;br&gt;
&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;A(idx) = [] ; % remove element from list&lt;br&gt;
&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
hth&lt;br&gt;
Jos</description>
    </item>
    <item>
      <pubDate>Thu, 23 Apr 2009 08:18:01 -0400</pubDate>
      <title>Re: filtering data problem</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/249721#644832</link>
      <author>Pekka Kumpulainen</author>
      <description>&quot;Jos &quot; &amp;lt;#10584@fileexchange.com&amp;gt; wrote in message &amp;lt;gsp1tf$bno$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &quot;Mike &quot; &amp;lt;sulfateion@gmail.com&amp;gt; wrote in message &amp;lt;gsoc01$eog$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; Hi&lt;br&gt;
&amp;gt; &amp;gt;     I usually need to filter data.  Sometimes I use logical-indexing, but I found there are many temporary arrays I created.  Does that way waste memory?  How to avoid this?&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Mike&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Logical indexing is very powerful but indeed creates a (temporary) array. However, they use 1/8 of the memory occupied by  double array of the same size:&lt;br&gt;
&amp;gt; A = rand(100,1) ; B = A &amp;gt; 0.5 ; whos&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; You can clear out, or overwrite, any variables you no longer need:&lt;br&gt;
&amp;gt; A = rand(10,1) ;&lt;br&gt;
&amp;gt; q = A &amp;gt; 0.5 ;&lt;br&gt;
&amp;gt; A = A(q) ; % overwrite&lt;br&gt;
&amp;gt; clear q ;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; If this is not an option, you can turn to very inefficient loops, like this one, which does not occupy (a lot of) additional memory ... &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A = rand(10,1) ;&lt;br&gt;
&amp;gt; idx = 1 ;&lt;br&gt;
&amp;gt; while (idx &amp;lt;= numel(A)),&lt;br&gt;
&amp;gt;   if A(idx) &amp;gt; 0.5,&lt;br&gt;
&amp;gt;     idx = idx + 1 ; % goto next element&lt;br&gt;
&amp;gt;   else&lt;br&gt;
&amp;gt;     A(idx) = [] ; % remove element from list&lt;br&gt;
&amp;gt;   end&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; hth&lt;br&gt;
&amp;gt; Jos&lt;br&gt;
&lt;br&gt;
Does enybody know what really happens in this kind of loop?&lt;br&gt;
Each time when  an element is removed (assigned to empty), does MATLAB have to find a new contiguous memory block for the new slightly smaller array? Thus fragmenting memory. </description>
    </item>
    <item>
      <pubDate>Fri, 24 Apr 2009 04:09:23 -0400</pubDate>
      <title>Re: filtering data problem</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/249721#645068</link>
      <author>Mike</author>
      <description>On Apr 23, 2:30=A0pm, &quot;Jos &quot; &amp;lt;#10...@fileexchange.com&amp;gt; wrote:&lt;br&gt;
&amp;gt; &quot;Mike &quot; &amp;lt;sulfate...@gmail.com&amp;gt; wrote in message &amp;lt;gsoc01$eo...@fred.mathwo=&lt;br&gt;
rks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; Hi&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 I usually need to filter data. =A0Sometimes I use logical-index=&lt;br&gt;
ing, but I found there are many temporary arrays I created. =A0Does that wa=&lt;br&gt;
y waste memory? =A0How to avoid this?&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; Mike&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; Logical indexing is very powerful but indeed creates a (temporary) array.=&lt;br&gt;
&amp;nbsp;However, they use 1/8 of the memory occupied by =A0double array of the sam=&lt;br&gt;
e size:&lt;br&gt;
&amp;gt; A =3D rand(100,1) ; B =3D A &amp;gt; 0.5 ; whos&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; You can clear out, or overwrite, any variables you no longer need:&lt;br&gt;
&amp;gt; A =3D rand(10,1) ;&lt;br&gt;
&amp;gt; q =3D A &amp;gt; 0.5 ;&lt;br&gt;
&amp;gt; A =3D A(q) ; % overwrite&lt;br&gt;
&amp;gt; clear q ;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; If this is not an option, you can turn to very inefficient loops, like th=&lt;br&gt;
is one, which does not occupy (a lot of) additional memory ...&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; A =3D rand(10,1) ;&lt;br&gt;
&amp;gt; idx =3D 1 ;&lt;br&gt;
&amp;gt; while (idx &amp;lt;=3D numel(A)),&lt;br&gt;
&amp;gt; =A0 if A(idx) &amp;gt; 0.5,&lt;br&gt;
&amp;gt; =A0 =A0 idx =3D idx + 1 ; % goto next element&lt;br&gt;
&amp;gt; =A0 else&lt;br&gt;
&amp;gt; =A0 =A0 A(idx) =3D [] ; % remove element from list&lt;br&gt;
&amp;gt; =A0 end&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; hth&lt;br&gt;
&amp;gt; Jos&lt;br&gt;
&lt;br&gt;
Thank you very much, Jos.&lt;br&gt;
Allow me to add some cputime elapse time statements.&lt;br&gt;
&lt;br&gt;
N=3D100000;&lt;br&gt;
t =3D cputime;&lt;br&gt;
A =3D rand(N,1) ;&lt;br&gt;
q =3D A &amp;gt; 0.5 ;&lt;br&gt;
A =3D A(q) ; % overwrite&lt;br&gt;
clear q ;&lt;br&gt;
e=3Dcputime-t&lt;br&gt;
&lt;br&gt;
t =3D cputime;&lt;br&gt;
A =3D rand(N,1) ;&lt;br&gt;
idx =3D 1 ;&lt;br&gt;
while (idx &amp;lt;=3D numel(A)),&lt;br&gt;
&amp;nbsp;&amp;nbsp;if A(idx) &amp;gt; 0.5,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;idx =3D idx + 1 ; % goto next element&lt;br&gt;
&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;A(idx) =3D [] ; % remove element from list&lt;br&gt;
&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
e=3Dcputime-t&lt;br&gt;
&lt;br&gt;
e =3D&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.0156&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
e =3D&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;46.5781&lt;br&gt;
&lt;br&gt;
The latter one is very inefficient as you say.&lt;br&gt;
In practice, I filter data using the first way continuously.&lt;br&gt;
The inefficiency would propagate one by one using element-by-element&lt;br&gt;
way.&lt;br&gt;
&lt;br&gt;
Mike</description>
    </item>
    <item>
      <pubDate>Fri, 24 Apr 2009 06:40:22 -0400</pubDate>
      <title>Re: filtering data problem</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/249721#645075</link>
      <author>Bruno Luong</author>
      <description>&quot;Pekka Kumpulainen&quot; &amp;lt;pekka.nospam.kumpulainen@tut.please.fi&amp;gt; wrote in message &amp;lt;gsp87p$cdu$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &quot;Jos &quot; &amp;lt;#10584@fileexchange.com&amp;gt; wrote in message &amp;lt;gsp1tf$bno$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Does enybody know what really happens in this kind of loop?&lt;br&gt;
&amp;gt; Each time when  an element is removed (assigned to empty), does MATLAB have to find a new contiguous memory block for the new slightly smaller array? Thus fragmenting memory. &lt;br&gt;
&lt;br&gt;
Yes it does (Using my own PrintPtr mex command to track data pointer):&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; a=[1:10]&lt;br&gt;
a =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1     2     3     4     5     6     7     8     9    10&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; PrintPtr(a)&lt;br&gt;
Ptr=0E23B720x&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;gt;&amp;gt; a(1)=[]&lt;br&gt;
a =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2     3     4     5     6     7     8     9    10&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; PrintPtr(a)&lt;br&gt;
Ptr=0E3F1790x % &amp;lt;- it changes&lt;br&gt;
&lt;br&gt;
Bruno</description>
    </item>
    <item>
      <pubDate>Fri, 24 Apr 2009 07:09:03 -0400</pubDate>
      <title>Re: filtering data problem</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/249721#645079</link>
      <author>Pekka Kumpulainen</author>
      <description>&quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in message &amp;lt;gsrmsm$5pv$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &quot;Pekka Kumpulainen&quot; &amp;lt;pekka.nospam.kumpulainen@tut.please.fi&amp;gt; wrote in message &amp;lt;gsp87p$cdu$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; &quot;Jos &quot; &amp;lt;#10584@fileexchange.com&amp;gt; wrote in message &amp;lt;gsp1tf$bno$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Does enybody know what really happens in this kind of loop?&lt;br&gt;
&amp;gt; &amp;gt; Each time when  an element is removed (assigned to empty), does MATLAB have to find a new contiguous memory block for the new slightly smaller array? Thus fragmenting memory. &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Yes it does (Using my own PrintPtr mex command to track data pointer):&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt;&amp;gt; a=[1:10]&lt;br&gt;
&amp;gt; a =&lt;br&gt;
&amp;gt;      1     2     3     4     5     6     7     8     9    10&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt;&amp;gt; PrintPtr(a)&lt;br&gt;
&amp;gt; Ptr=0E23B720x&lt;br&gt;
&amp;gt;  &lt;br&gt;
&amp;gt; &amp;gt;&amp;gt; a(1)=[]&lt;br&gt;
&amp;gt; a =&lt;br&gt;
&amp;gt;      2     3     4     5     6     7     8     9    10&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt;&amp;gt; PrintPtr(a)&lt;br&gt;
&amp;gt; Ptr=0E3F1790x % &amp;lt;- it changes&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Bruno&lt;br&gt;
&lt;br&gt;
Just what I thought, thanks.&lt;br&gt;
Would that PrintPtr be available? It would be handy sometimes to see what actually happens in the memory.</description>
    </item>
    <item>
      <pubDate>Fri, 24 Apr 2009 07:16:03 -0400</pubDate>
      <title>Re: filtering data problem</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/249721#645081</link>
      <author>Pekka Kumpulainen</author>
      <description>&quot;Pekka Kumpulainen&quot; &amp;lt;pekka.nospam.kumpulainen@tut.please.fi&amp;gt; wrote in message &amp;lt;gsroif$dt$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in message &amp;lt;gsrmsm$5pv$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; &quot;Pekka Kumpulainen&quot; &amp;lt;pekka.nospam.kumpulainen@tut.please.fi&amp;gt; wrote in message &amp;lt;gsp87p$cdu$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; &quot;Jos &quot; &amp;lt;#10584@fileexchange.com&amp;gt; wrote in message &amp;lt;gsp1tf$bno$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Does enybody know what really happens in this kind of loop?&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt; Each time when  an element is removed (assigned to empty), does MATLAB have to find a new contiguous memory block for the new slightly smaller array? Thus fragmenting memory. &lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Yes it does (Using my own PrintPtr mex command to track data pointer):&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt;&amp;gt; a=[1:10]&lt;br&gt;
&amp;gt; &amp;gt; a =&lt;br&gt;
&amp;gt; &amp;gt;      1     2     3     4     5     6     7     8     9    10&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt;&amp;gt; PrintPtr(a)&lt;br&gt;
&amp;gt; &amp;gt; Ptr=0E23B720x&lt;br&gt;
&amp;gt; &amp;gt;  &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt;&amp;gt; a(1)=[]&lt;br&gt;
&amp;gt; &amp;gt; a =&lt;br&gt;
&amp;gt; &amp;gt;      2     3     4     5     6     7     8     9    10&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt;&amp;gt; PrintPtr(a)&lt;br&gt;
&amp;gt; &amp;gt; Ptr=0E3F1790x % &amp;lt;- it changes&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Bruno&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Just what I thought, thanks.&lt;br&gt;
&amp;gt; Would that PrintPtr be available? It would be handy sometimes to see what actually happens in the memory.&lt;br&gt;
&lt;br&gt;
Forget the previous. I only serched FEX before posting. Found it two minutes after that.</description>
    </item>
  </channel>
</rss>

