<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363</link>
    <title>MATLAB Central Newsreader - Vectorizing data lookback?</title>
    <description>Feed for thread: Vectorizing data lookback?</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>Sun, 31 Aug 2008 05:44:02 -0400</pubDate>
      <title>Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598101</link>
      <author>Nicholas </author>
      <description>I'm trying to develop a function that traverses a vector and&lt;br&gt;
outputs a '1' if the current value is greater than the&lt;br&gt;
previous N-values, '0' if it's not.&lt;br&gt;
&lt;br&gt;
Programming this into a &quot;for&quot; loop is trivial:&lt;br&gt;
&lt;br&gt;
for ii = n:length(data)&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if data(ii) &amp;gt; max(  data(ii-n:ii-1)  );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output(ii) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output(ii) = 0;&lt;br&gt;
&lt;br&gt;
end;&lt;br&gt;
&lt;br&gt;
The problem is this approach takes forever and a day to&lt;br&gt;
process. It takes ~2 orders of magnitude longer to run than&lt;br&gt;
similar (but vectorized) functions I've written that operate&lt;br&gt;
on the same exact data. &lt;br&gt;
&lt;br&gt;
I've been trying to vectorize this function as well to&lt;br&gt;
improve the speed, but I can't wrap my brain around it. Any&lt;br&gt;
suggestions?</description>
    </item>
    <item>
      <pubDate>Mon, 01 Sep 2008 09:26:39 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598180</link>
      <author>heiko_marx@hotmail.com</author>
      <description>On 31 Aug., 07:44, &quot;Nicholas &quot;&lt;br&gt;
&amp;lt;OtherPeopleTookAllTheGoodNa...@deleteme.gmail.com&amp;gt; wrote:&lt;br&gt;
&amp;gt; I'm trying to develop a function that traverses a vector and&lt;br&gt;
&amp;gt; outputs a '1' if the current value is greater than the&lt;br&gt;
&amp;gt; previous N-values, '0' if it's not.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; Programming this into a &quot;for&quot; loop is trivial:&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; for ii =3D n:length(data)&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; =A0 =A0 =A0if data(ii) &amp;gt; max( =A0data(ii-n:ii-1) =A0);&lt;br&gt;
&amp;gt; =A0 =A0 =A0 =A0 =A0 output(ii) =3D 1;&lt;br&gt;
&amp;gt; =A0 =A0 =A0else&lt;br&gt;
&amp;gt; =A0 =A0 =A0 =A0 =A0 output(ii) =3D 0;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; end;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; The problem is this approach takes forever and a day to&lt;br&gt;
&amp;gt; process. It takes ~2 orders of magnitude longer to run than&lt;br&gt;
&amp;gt; similar (but vectorized) functions I've written that operate&lt;br&gt;
&amp;gt; on the same exact data.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; I've been trying to vectorize this function as well to&lt;br&gt;
&amp;gt; improve the speed, but I can't wrap my brain around it. Any&lt;br&gt;
&amp;gt; suggestions?&lt;br&gt;
&lt;br&gt;
Hi.&lt;br&gt;
&lt;br&gt;
I found that avoiding the max function in each loop reduces the time&lt;br&gt;
by a good amount.&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; tic; for ii =3D n:length(data), if data(ii) &amp;gt; max(data(1:ii-1)); output(=&lt;br&gt;
ii) =3D 1; else output(ii) =3D 0;end, end, toc&lt;br&gt;
Elapsed time is 0.010647 seconds.&lt;br&gt;
&amp;gt;&amp;gt; tic; m =3D max(data(1:n-1)); for ii =3D n:length(data), if data(ii) &amp;gt; m,=&lt;br&gt;
&amp;nbsp;output2(ii) =3D 1; m =3D data(ii); else output2(ii) =3D 0;end, end, toc&lt;br&gt;
Elapsed time is 0.001932 seconds.&lt;br&gt;
&amp;gt;&amp;gt; isequal(output, output2)&lt;br&gt;
ans =3D&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;br&gt;
&lt;br&gt;
The times refer to a data set of 1000 random values, aand are of&lt;br&gt;
course machine-dependent.&lt;br&gt;
&lt;br&gt;
Hope this helps,&lt;br&gt;
Heiko</description>
    </item>
    <item>
      <pubDate>Mon, 01 Sep 2008 14:03:21 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598204</link>
      <author>Titus</author>
      <description>&lt;br&gt;
&quot;Nicholas &quot; &amp;lt;OtherPeopleTookAllTheGoodNames@deleteme.gmail.com&amp;gt; schrieb im &lt;br&gt;
Newsbeitrag news:g9db32$oq6$1@fred.mathworks.com...&lt;br&gt;
&amp;gt; I'm trying to develop a function that traverses a vector and&lt;br&gt;
&amp;gt; outputs a '1' if the current value is greater than the&lt;br&gt;
&amp;gt; previous N-values, '0' if it's not.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; Programming this into a &quot;for&quot; loop is trivial:&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; for ii = n:length(data)&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;     if data(ii) &amp;gt; max(  data(ii-n:ii-1)  );&lt;br&gt;
&amp;gt;          output(ii) = 1;&lt;br&gt;
&amp;gt;     else&lt;br&gt;
&amp;gt;          output(ii) = 0;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; end;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; The problem is this approach takes forever and a day to&lt;br&gt;
&amp;gt; process. It takes ~2 orders of magnitude longer to run than&lt;br&gt;
&amp;gt; similar (but vectorized) functions I've written that operate&lt;br&gt;
&amp;gt; on the same exact data.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; I've been trying to vectorize this function as well to&lt;br&gt;
&amp;gt; improve the speed, but I can't wrap my brain around it. Any&lt;br&gt;
&amp;gt; suggestions?&lt;br&gt;
&lt;br&gt;
Hi,&lt;br&gt;
&lt;br&gt;
without really answering the question: did you preallocate your output? &lt;br&gt;
Something like&lt;br&gt;
output = zeros(size(data));&lt;br&gt;
before entering the loop?&lt;br&gt;
&lt;br&gt;
Titus </description>
    </item>
    <item>
      <pubDate>Wed, 03 Sep 2008 15:28:02 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598518</link>
      <author>Nicholas </author>
      <description>heiko_marx@hotmail.com wrote in message&lt;br&gt;
&amp;lt;d3e32ef1-ba0b-4789-a5b1-220c64ee361c@25g2000hsx.googlegroups.com&amp;gt;...&lt;br&gt;
&lt;br&gt;
&amp;gt; Hi.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I found that avoiding the max function in each loop&lt;br&gt;
reduces the time&lt;br&gt;
&amp;gt; by a good amount.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt;&amp;gt; tic; for ii =3D n:length(data), if data(ii) &amp;gt;&lt;br&gt;
max(data(1:ii-1)); output(=&lt;br&gt;
&amp;gt; ii) =3D 1; else output(ii) =3D 0;end, end, toc&lt;br&gt;
&amp;gt; Elapsed time is 0.010647 seconds.&lt;br&gt;
&amp;gt; &amp;gt;&amp;gt; tic; m =3D max(data(1:n-1)); for ii =3D n:length(data),&lt;br&gt;
if data(ii) &amp;gt; m,=&lt;br&gt;
&amp;gt;  output2(ii) =3D 1; m =3D data(ii); else output2(ii) =3D&lt;br&gt;
0;end, end, toc&lt;br&gt;
&amp;gt; Elapsed time is 0.001932 seconds.&lt;br&gt;
&amp;gt; &amp;gt;&amp;gt; isequal(output, output2)&lt;br&gt;
&amp;gt; ans =3D&lt;br&gt;
&amp;gt;      1&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; The times refer to a data set of 1000 random values, aand&lt;br&gt;
are of&lt;br&gt;
&amp;gt; course machine-dependent.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Hope this helps,&lt;br&gt;
&amp;gt; Heiko&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Heiko-&lt;br&gt;
&lt;br&gt;
If I'm reading your code correctly, it wouldn't work for my&lt;br&gt;
application. It computes a single max value for the vector&lt;br&gt;
m, and compares this value to data on a bar by bar basis.&lt;br&gt;
&lt;br&gt;
In my application, I need to compare each data point to the&lt;br&gt;
previous 'n' data points where n &amp;lt; length(data). In other&lt;br&gt;
words, I have vectors that have ~750K data points. If I&lt;br&gt;
specify n = 25, the function would take data point 26 from&lt;br&gt;
that vector and see if it was greater than the previous 25&lt;br&gt;
data points (1-25). It would then move to data point 27 and&lt;br&gt;
see if was greater than the previous 25 data points (2-26).&lt;br&gt;
Then it moves to point 28 and compares it to point 3-27... </description>
    </item>
    <item>
      <pubDate>Wed, 03 Sep 2008 15:30:19 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598520</link>
      <author>Nicholas </author>
      <description>&quot;Titus&quot; &amp;lt;titus.edelhofer@mathworks.de&amp;gt; wrote in message&lt;br&gt;
&amp;lt;g9gsna$qll$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&lt;br&gt;
&amp;gt; Hi,&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; without really answering the question: did you preallocate&lt;br&gt;
your output? &lt;br&gt;
&amp;gt; Something like&lt;br&gt;
&amp;gt; output = zeros(size(data));&lt;br&gt;
&amp;gt; before entering the loop?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Titus &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
Titus-&lt;br&gt;
&lt;br&gt;
Yes I do preallocate the vectors. I've tried to do&lt;br&gt;
everything I can to make the loop JIT compatible, but it's&lt;br&gt;
still too slow.&lt;br&gt;
&lt;br&gt;
Nick</description>
    </item>
    <item>
      <pubDate>Wed, 03 Sep 2008 17:04:03 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598541</link>
      <author>Lars Barring</author>
      <description>&quot;Nicholas &quot;&lt;br&gt;
&amp;lt;OtherPeopleTookAllTheGoodNames@deleteme.gmail.com&amp;gt; wrote in&lt;br&gt;
message &amp;lt;g9maib$9di$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Yes I do preallocate the vectors. I've tried to do&lt;br&gt;
&amp;gt; everything I can to make the loop JIT compatible, but it's&lt;br&gt;
&amp;gt; still too slow.&lt;br&gt;
&lt;br&gt;
Maybe this FEX function for running extrema (max or min or&lt;br&gt;
both) &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=18551&amp;objectType=file&quot;&gt;http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=18551&amp;objectType=file&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
will help you speed up the code. Probably you will have to &lt;br&gt;
create a vector of the running max-values of the same length&lt;br&gt;
as your input data.&lt;br&gt;
&lt;br&gt;
hth&lt;br&gt;
Lars</description>
    </item>
    <item>
      <pubDate>Wed, 03 Sep 2008 18:40:19 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598551</link>
      <author>Alan B</author>
      <description>&quot;Lars Barring&quot; &amp;lt;lars.barring@myworkplace.se&amp;gt; wrote in&lt;br&gt;
message &amp;lt;g9mg23$ed4$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &quot;Nicholas &quot;&lt;br&gt;
&amp;gt; &amp;lt;OtherPeopleTookAllTheGoodNames@deleteme.gmail.com&amp;gt; wrote in&lt;br&gt;
&amp;gt; message &amp;lt;g9maib$9di$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; Yes I do preallocate the vectors. I've tried to do&lt;br&gt;
&amp;gt; &amp;gt; everything I can to make the loop JIT compatible, but it's&lt;br&gt;
&amp;gt; &amp;gt; still too slow.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Maybe this FEX function for running extrema (max or min or&lt;br&gt;
&amp;gt; both) &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;&lt;br&gt;
&lt;a href=&quot;http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=18551&amp;objectType=file&quot;&gt;http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=18551&amp;objectType=file&lt;/a&gt;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; will help you speed up the code. Probably you will have to &lt;br&gt;
&amp;gt; create a vector of the running max-values of the same length&lt;br&gt;
&amp;gt; as your input data.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; hth&lt;br&gt;
&amp;gt; Lars&lt;br&gt;
&lt;br&gt;
If you have the signal processing toolbox, you can use the&lt;br&gt;
buffer function to transform a 1D signal into a (window&lt;br&gt;
size)*(total number of windows) 2D array, then take the max&lt;br&gt;
columnwise, and compare with the appropriately shifted 1D&lt;br&gt;
signal. I'm not sure if that would improve the speed any,&lt;br&gt;
and I'm pretty sure you'd have to break down the full vector&lt;br&gt;
beforehand too... But its something to try. &lt;br&gt;
&lt;br&gt;
If you don't have buffer() available, you can do something&lt;br&gt;
similar with reshape, using a for loop over (window size)&lt;br&gt;
iterations rather than (number of windows) iterations, which&lt;br&gt;
may help things some.</description>
    </item>
    <item>
      <pubDate>Wed, 03 Sep 2008 19:11:02 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598560</link>
      <author>Bruno Luong</author>
      <description>&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I've been trying to vectorize this function as well to&lt;br&gt;
&amp;gt; improve the speed, but I can't wrap my brain around it. Any&lt;br&gt;
&amp;gt; suggestions?&lt;br&gt;
&lt;br&gt;
ndata=750e3;&lt;br&gt;
nwin=25;&lt;br&gt;
upper=10;&lt;br&gt;
&lt;br&gt;
data=round(upper*rand(1,ndata));&lt;br&gt;
&lt;br&gt;
% for loop&lt;br&gt;
tic&lt;br&gt;
output1=zeros(size(data));&lt;br&gt;
for ii = nwin+1:length(data)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if data(ii) &amp;gt; max( data(ii-nwin:ii-1) );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output1(ii) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output1(ii) = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
toc % Elapsed time is 9.436772 seconds.&lt;br&gt;
&lt;br&gt;
% expanding vectorized&lt;br&gt;
tic&lt;br&gt;
[I J]=ndgrid(2:nwin+1,1:ndata);&lt;br&gt;
temp = data(max(J-I+1,1));&lt;br&gt;
temp(J&amp;lt;I)=Inf;&lt;br&gt;
output2=all(bsxfun(@gt,data,temp),1);&lt;br&gt;
toc % Elapsed time is 2.461195 seconds.&lt;br&gt;
&lt;br&gt;
% check the results are identical&lt;br&gt;
all(output1==output2)&lt;br&gt;
&lt;br&gt;
% Bruno</description>
    </item>
    <item>
      <pubDate>Wed, 03 Sep 2008 19:50:18 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598571</link>
      <author>Bruno Luong</author>
      <description>Faster still:&lt;br&gt;
&lt;br&gt;
ndata=750e3;&lt;br&gt;
nwin=25;&lt;br&gt;
upper=10;&lt;br&gt;
&lt;br&gt;
data=upper*rand(1,ndata);&lt;br&gt;
&lt;br&gt;
tic&lt;br&gt;
output1=zeros(size(data));&lt;br&gt;
for ii = nwin+1:length(data)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if data(ii) &amp;gt; max( data(ii-nwin:ii-1) );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output1(ii) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output1(ii) = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
toc % Elapsed time is 9.467494 seconds.&lt;br&gt;
&lt;br&gt;
tic&lt;br&gt;
temp = data(max(bsxfun(@minus, (1:ndata),(1:nwin)'),1));&lt;br&gt;
for i=1:size(temp,1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp(i,1:i)=Inf;&lt;br&gt;
end&lt;br&gt;
output2=all(bsxfun(@gt,data,temp),1);&lt;br&gt;
toc % Elapsed time is 1.530637 seconds.&lt;br&gt;
&lt;br&gt;
all(output1==output2)&lt;br&gt;
&lt;br&gt;
% Bruno</description>
    </item>
    <item>
      <pubDate>Wed, 03 Sep 2008 21:38:02 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598591</link>
      <author>Lars Barring</author>
      <description>&quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in&lt;br&gt;
message &amp;lt;g9mppq$f7c$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Faster still:&lt;br&gt;
&amp;gt; .....&lt;br&gt;
&lt;br&gt;
and here is a third alternative that clocks in favourably&lt;br&gt;
&lt;br&gt;
% clean up and start test from scratch&lt;br&gt;
clear all&lt;br&gt;
pack&lt;br&gt;
&lt;br&gt;
%some test data&lt;br&gt;
ndata=10e6;  %%% some more data, may need to reduced&lt;br&gt;
nwin=5;&lt;br&gt;
nwin2=floor(nwin/2);&lt;br&gt;
upper=10;&lt;br&gt;
data=round(upper*rand(1,ndata));&lt;br&gt;
&lt;br&gt;
% Bruno 1&lt;br&gt;
tic&lt;br&gt;
output1=zeros(size(data));&lt;br&gt;
for ii = nwin+1:length(data)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if data(ii) &amp;gt; max( data(ii-nwin:ii-1) );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output1(ii) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output1(ii) = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
toc &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
% Bruno 2  runs out of memory&lt;br&gt;
%tic&lt;br&gt;
%temp = data(max(bsxfun(@minus, (1:ndata),(1:nwin)'),1));&lt;br&gt;
%for i=1:size(temp,1)&lt;br&gt;
%    temp(i,1:i)=Inf;&lt;br&gt;
%end&lt;br&gt;
%output2=all(bsxfun(@gt,data,temp),1);&lt;br&gt;
%toc &lt;br&gt;
&lt;br&gt;
&lt;br&gt;
% running Extreme: FEX #18551 by Dan Kominsky&lt;br&gt;
tic&lt;br&gt;
nwin2=floor(nwin/2); % for convenience&lt;br&gt;
maxd=runningExtreme(data,nwin,'max'); &lt;br&gt;
% adjustments to handle centred running window&lt;br&gt;
maxd(1:nwin2)=NaN;&lt;br&gt;
maxd=[repmat(NaN,1,nwin2+1) maxd(1:end-nwin2-1)];&lt;br&gt;
output3=data&amp;gt;maxd;&lt;br&gt;
toc&lt;br&gt;
&lt;br&gt;
%all(output1==output2)&lt;br&gt;
&lt;br&gt;
all(output1==output3)&lt;br&gt;
&lt;br&gt;
%%%%%&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
hth&lt;br&gt;
Lars</description>
    </item>
    <item>
      <pubDate>Wed, 03 Sep 2008 22:03:01 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598594</link>
      <author>Bruno Luong</author>
      <description>&quot;Lars Barring&quot; &amp;lt;lars.barring@myworkplace.se&amp;gt; wrote in&lt;br&gt;
message &amp;lt;g9n03q$3le$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % running Extreme: FEX #18551 by Dan Kominsky&lt;br&gt;
&amp;gt;&lt;br&gt;
&lt;br&gt;
... Ah very neat this van Herk's algorithm&lt;br&gt;
&lt;br&gt;
Here is timings on my laptop with 1e6 data:&lt;br&gt;
&lt;br&gt;
Elapsed time is 12.691225 seconds. % for loop&lt;br&gt;
Elapsed time is 2.264592 seconds. % &quot;Bruno 2&quot;&lt;br&gt;
Elapsed time is 0.796989 seconds. % Lars/Dan&lt;br&gt;
&lt;br&gt;
Bruno</description>
    </item>
    <item>
      <pubDate>Fri, 05 Sep 2008 06:03:12 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598806</link>
      <author>heiko_marx@hotmail.com</author>
      <description>On 3 Sep., 17:28, &quot;Nicholas &quot;&lt;br&gt;
&amp;lt;OtherPeopleTookAllTheGoodNa...@deleteme.gmail.com&amp;gt; wrote:&lt;br&gt;
&amp;gt; heiko_m...@hotmail.com wrote in message&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;lt;d3e32ef1-ba0b-4789-a5b1-220c64ee3...@25g2000hsx.googlegroups.com&amp;gt;...&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; Hi.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; I found that avoiding the max function in each loop&lt;br&gt;
&amp;gt; reduces the time&lt;br&gt;
&amp;gt; &amp;gt; by a good amount.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt;&amp;gt; tic; for ii =3D3D n:length(data), if data(ii) &amp;gt;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; max(data(1:ii-1)); output(=3D&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; ii) =3D3D 1; else output(ii) =3D3D 0;end, end, toc&lt;br&gt;
&amp;gt; &amp;gt; Elapsed time is 0.010647 seconds.&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt;&amp;gt; tic; m =3D3D max(data(1:n-1)); for ii =3D3D n:length(data),&lt;br&gt;
&amp;gt; if data(ii) &amp;gt; m,=3D&lt;br&gt;
&amp;gt; &amp;gt; =A0output2(ii) =3D3D 1; m =3D3D data(ii); else output2(ii) =3D3D&lt;br&gt;
&amp;gt; 0;end, end, toc&lt;br&gt;
&amp;gt; &amp;gt; Elapsed time is 0.001932 seconds.&lt;br&gt;
&amp;gt; &amp;gt; &amp;gt;&amp;gt; isequal(output, output2)&lt;br&gt;
&amp;gt; &amp;gt; ans =3D3D&lt;br&gt;
&amp;gt; &amp;gt; =A0 =A0 =A01&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; The times refer to a data set of 1000 random values, aand&lt;br&gt;
&amp;gt; are of&lt;br&gt;
&amp;gt; &amp;gt; course machine-dependent.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; &amp;gt; Hope this helps,&lt;br&gt;
&amp;gt; &amp;gt;Heiko&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; Heiko-&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; If I'm reading your code correctly, it wouldn't work for my&lt;br&gt;
&amp;gt; application. It computes a single max value for the vector&lt;br&gt;
&amp;gt; m, and compares this value to data on a bar by bar basis.&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; In my application, I need to compare each data point to the&lt;br&gt;
&amp;gt; previous 'n' data points where n &amp;lt; length(data). In other&lt;br&gt;
&amp;gt; words, I have vectors that have ~750K data points. If I&lt;br&gt;
&amp;gt; specify n =3D 25, the function would take data point 26 from&lt;br&gt;
&amp;gt; that vector and see if it was greater than the previous 25&lt;br&gt;
&amp;gt; data points (1-25). It would then move to data point 27 and&lt;br&gt;
&amp;gt; see if was greater than the previous 25 data points (2-26).&lt;br&gt;
&amp;gt; Then it moves to point 28 and compares it to point 3-27...&lt;br&gt;
&lt;br&gt;
Hi again.&lt;br&gt;
&lt;br&gt;
What my algorithm does is assume that if the value for n =3D 25 is&lt;br&gt;
greater than max(v(1:24)), then max(v(1:25)) =3D v(25). In that case you&lt;br&gt;
don't have to find the max value from 1:n, but only from the last n&lt;br&gt;
where the max was exceeded. Its some kind of maxhold, and it's more&lt;br&gt;
efficient for large vectors. Think of the unnecessary steps you can&lt;br&gt;
save if you know that of your 750k values the largest is 749998, and&lt;br&gt;
compare max(v(1:750000)) to max(v(749998), v(750000)). And it's&lt;br&gt;
equivalent to your code, as can be seen by the isequal result.&lt;br&gt;
&lt;br&gt;
Try it! Do! :-)&lt;br&gt;
Heiko</description>
    </item>
    <item>
      <pubDate>Fri, 05 Sep 2008 07:40:20 -0400</pubDate>
      <title>Re: Vectorizing data lookback?</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235363#598819</link>
      <author>Bruno Luong</author>
      <description>heiko_marx@hotmail.com wrote in message&lt;br&gt;
&amp;lt;74aae18b-e091-4486-8e7c-d8a6e912952b@m44g2000hsc.googlegroups.com&amp;gt;...&lt;br&gt;
&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Try it! Do! :-)&lt;br&gt;
&lt;br&gt;
Your algorithm does not work as specified:&lt;br&gt;
&lt;br&gt;
n=25;&lt;br&gt;
data=[10 zeros(1,98) 1];&lt;br&gt;
&lt;br&gt;
% original algo&lt;br&gt;
for ii =n+1:length(data)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if data(ii) &amp;gt; max(data(ii-n:ii-1));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output(ii) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output(ii) = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% Heiko's algo&lt;br&gt;
m = max(data(1:n-1));&lt;br&gt;
for ii = n:length(data)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if data(ii) &amp;gt; m &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output2(ii) = 1; &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m = data(ii); &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output2(ii) = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
isequal(output, output2) % not equal&lt;br&gt;
&lt;br&gt;
% Bruno</description>
    </item>
  </channel>
</rss>

