<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/173244</link>
    <title>MATLAB Central Newsreader - peak detection</title>
    <description>Feed for thread: peak detection</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>Fri, 25 Jul 2008 10:46:03 -0400</pubDate>
      <title>peak detection</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/173244#445434</link>
      <author>Dave Brackett</author>
      <description>I have been using a peak detection m file from&lt;br&gt;
&lt;a href=&quot;http://www.billauer.co.il/peakdet.html.&quot;&gt;http://www.billauer.co.il/peakdet.html.&lt;/a&gt; The code is shown below.&lt;br&gt;
&lt;br&gt;
Does anyone know if its possible to vectorise this function&lt;br&gt;
as it currently uses for loops? and if it is, could you show&lt;br&gt;
me how please? thanks. more info can be found at the above link.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
function [maxtab, mintab]=peakdet(v, delta)&lt;br&gt;
%PEAKDET Detect peaks in a vector&lt;br&gt;
%        [MAXTAB, MINTAB] = PEAKDET(V, DELTA) finds the local&lt;br&gt;
%        maxima and minima (&quot;peaks&quot;) in the vector V.&lt;br&gt;
%        A point is considered a maximum peak if it has the&lt;br&gt;
maximal&lt;br&gt;
%        value, and was preceded (to the left) by a value&lt;br&gt;
lower by&lt;br&gt;
%        DELTA. MAXTAB and MINTAB consists of two columns.&lt;br&gt;
Column 1&lt;br&gt;
%        contains indices in V, and column 2 the found values.&lt;br&gt;
&lt;br&gt;
% Eli Billauer, 3.4.05 (Explicitly not copyrighted).&lt;br&gt;
% This function is released to the public domain; Any use is&lt;br&gt;
allowed.&lt;br&gt;
&lt;br&gt;
maxtab = [];&lt;br&gt;
mintab = [];&lt;br&gt;
&lt;br&gt;
v = v(:); % Just in case this wasn't a proper vector&lt;br&gt;
&lt;br&gt;
if (length(delta(:)))&amp;gt;1&lt;br&gt;
&amp;nbsp;&amp;nbsp;error('Input argument DELTA must be a scalar');&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
if delta &amp;lt;= 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;error('Input argument DELTA must be positive');&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
mn = Inf; mx = -Inf;&lt;br&gt;
mnpos = NaN; mxpos = NaN;&lt;br&gt;
&lt;br&gt;
lookformax = 1;&lt;br&gt;
&lt;br&gt;
for i=1:length(v)&lt;br&gt;
&amp;nbsp;&amp;nbsp;this = v(i);&lt;br&gt;
&amp;nbsp;&amp;nbsp;if this &amp;gt; mx, mx = this; mxpos = i; end&lt;br&gt;
&amp;nbsp;&amp;nbsp;if this &amp;lt; mn, mn = this; mnpos = i; end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;if lookformax&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if this &amp;lt; mx-delta&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxtab = [maxtab ; mxpos mx];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mn = this; mnpos = i;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lookformax = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end  &lt;br&gt;
&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if this &amp;gt; mn+delta&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mintab = [mintab ; mnpos mn];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mx = this; mxpos = i;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lookformax = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end</description>
    </item>
    <item>
      <pubDate>Fri, 25 Jul 2008 11:53:29 -0400</pubDate>
      <title>Re: peak detection</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/173244#445442</link>
      <author>Lothar Schmidt</author>
      <description>Dave Brackett schrieb:&lt;br&gt;
&amp;gt; I have been using a peak detection m file from&lt;br&gt;
&amp;gt; &lt;a href=&quot;http://www.billauer.co.il/peakdet.html.&quot;&gt;http://www.billauer.co.il/peakdet.html.&lt;/a&gt; The code is shown below.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Does anyone know if its possible to vectorise this function&lt;br&gt;
&amp;gt; as it currently uses for loops? and if it is, could you show&lt;br&gt;
&amp;gt; me how please? thanks. more info can be found at the above link.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; function [maxtab, mintab]=peakdet(v, delta)&lt;br&gt;
&amp;gt; %PEAKDET Detect peaks in a vector&lt;br&gt;
&amp;gt; %        [MAXTAB, MINTAB] = PEAKDET(V, DELTA) finds the local&lt;br&gt;
&amp;gt; %        maxima and minima (&quot;peaks&quot;) in the vector V.&lt;br&gt;
&amp;gt; %        A point is considered a maximum peak if it has the&lt;br&gt;
&amp;gt; maximal&lt;br&gt;
&amp;gt; %        value, and was preceded (to the left) by a value&lt;br&gt;
&amp;gt; lower by&lt;br&gt;
&amp;gt; %        DELTA. MAXTAB and MINTAB consists of two columns.&lt;br&gt;
&amp;gt; Column 1&lt;br&gt;
&amp;gt; %        contains indices in V, and column 2 the found values.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % Eli Billauer, 3.4.05 (Explicitly not copyrighted).&lt;br&gt;
&amp;gt; % This function is released to the public domain; Any use is&lt;br&gt;
&amp;gt; allowed.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; maxtab = [];&lt;br&gt;
&amp;gt; mintab = [];&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; v = v(:); % Just in case this wasn't a proper vector&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; if (length(delta(:)))&amp;gt;1&lt;br&gt;
&amp;gt;   error('Input argument DELTA must be a scalar');&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; if delta &amp;lt;= 0&lt;br&gt;
&amp;gt;   error('Input argument DELTA must be positive');&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; mn = Inf; mx = -Inf;&lt;br&gt;
&amp;gt; mnpos = NaN; mxpos = NaN;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; lookformax = 1;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; for i=1:length(v)&lt;br&gt;
&amp;gt;   this = v(i);&lt;br&gt;
&amp;gt;   if this &amp;gt; mx, mx = this; mxpos = i; end&lt;br&gt;
&amp;gt;   if this &amp;lt; mn, mn = this; mnpos = i; end&lt;br&gt;
&amp;gt;   &lt;br&gt;
&amp;gt;   if lookformax&lt;br&gt;
&amp;gt;     if this &amp;lt; mx-delta&lt;br&gt;
&amp;gt;       maxtab = [maxtab ; mxpos mx];&lt;br&gt;
&amp;gt;       mn = this; mnpos = i;&lt;br&gt;
&amp;gt;       lookformax = 0;&lt;br&gt;
&amp;gt;     end  &lt;br&gt;
&amp;gt;   else&lt;br&gt;
&amp;gt;     if this &amp;gt; mn+delta&lt;br&gt;
&amp;gt;       mintab = [mintab ; mnpos mn];&lt;br&gt;
&amp;gt;       mx = this; mxpos = i;&lt;br&gt;
&amp;gt;       lookformax = 1;&lt;br&gt;
&amp;gt;     end&lt;br&gt;
&amp;gt;   end&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
index=2:length(v)-1;&lt;br&gt;
MAX_pos=find(v(i-1)+delta&amp;lt;v(i) &amp; v(i+1)+delta&amp;lt;v(i))+1;&lt;br&gt;
&lt;br&gt;
for finding the minima you'll shurely find a similar solution :-)&lt;br&gt;
&lt;br&gt;
Lothar</description>
    </item>
    <item>
      <pubDate>Fri, 25 Jul 2008 13:17:01 -0400</pubDate>
      <title>Re: peak detection</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/173244#445463</link>
      <author>Dave Brackett</author>
      <description>Lothar Schmidt &amp;lt;vapooroop@gmx.net&amp;gt; wrote in message&lt;br&gt;
&amp;lt;g6cerv$uc0$01$1@news.t-online.com&amp;gt;...&lt;br&gt;
&amp;gt; Dave Brackett schrieb:&lt;br&gt;
&amp;gt; &amp;gt; I have been using a peak detection m file from&lt;br&gt;
&amp;gt; &amp;gt; &lt;a href=&quot;http://www.billauer.co.il/peakdet.html.&quot;&gt;http://www.billauer.co.il/peakdet.html.&lt;/a&gt; The code is&lt;br&gt;
shown below.&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Does anyone know if its possible to vectorise this function&lt;br&gt;
&amp;gt; &amp;gt; as it currently uses for loops? and if it is, could you show&lt;br&gt;
&amp;gt; &amp;gt; me how please? thanks. more info can be found at the&lt;br&gt;
above link.&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; function [maxtab, mintab]=peakdet(v, delta)&lt;br&gt;
&amp;gt; &amp;gt; %PEAKDET Detect peaks in a vector&lt;br&gt;
&amp;gt; &amp;gt; %        [MAXTAB, MINTAB] = PEAKDET(V, DELTA) finds the&lt;br&gt;
local&lt;br&gt;
&amp;gt; &amp;gt; %        maxima and minima (&quot;peaks&quot;) in the vector V.&lt;br&gt;
&amp;gt; &amp;gt; %        A point is considered a maximum peak if it has the&lt;br&gt;
&amp;gt; &amp;gt; maximal&lt;br&gt;
&amp;gt; &amp;gt; %        value, and was preceded (to the left) by a value&lt;br&gt;
&amp;gt; &amp;gt; lower by&lt;br&gt;
&amp;gt; &amp;gt; %        DELTA. MAXTAB and MINTAB consists of two columns.&lt;br&gt;
&amp;gt; &amp;gt; Column 1&lt;br&gt;
&amp;gt; &amp;gt; %        contains indices in V, and column 2 the found&lt;br&gt;
values.&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; % Eli Billauer, 3.4.05 (Explicitly not copyrighted).&lt;br&gt;
&amp;gt; &amp;gt; % This function is released to the public domain; Any use is&lt;br&gt;
&amp;gt; &amp;gt; allowed.&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; maxtab = [];&lt;br&gt;
&amp;gt; &amp;gt; mintab = [];&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; v = v(:); % Just in case this wasn't a proper vector&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; if (length(delta(:)))&amp;gt;1&lt;br&gt;
&amp;gt; &amp;gt;   error('Input argument DELTA must be a scalar');&lt;br&gt;
&amp;gt; &amp;gt; end&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; if delta &amp;lt;= 0&lt;br&gt;
&amp;gt; &amp;gt;   error('Input argument DELTA must be positive');&lt;br&gt;
&amp;gt; &amp;gt; end&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; mn = Inf; mx = -Inf;&lt;br&gt;
&amp;gt; &amp;gt; mnpos = NaN; mxpos = NaN;&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; lookformax = 1;&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; for i=1:length(v)&lt;br&gt;
&amp;gt; &amp;gt;   this = v(i);&lt;br&gt;
&amp;gt; &amp;gt;   if this &amp;gt; mx, mx = this; mxpos = i; end&lt;br&gt;
&amp;gt; &amp;gt;   if this &amp;lt; mn, mn = this; mnpos = i; end&lt;br&gt;
&amp;gt; &amp;gt;   &lt;br&gt;
&amp;gt; &amp;gt;   if lookformax&lt;br&gt;
&amp;gt; &amp;gt;     if this &amp;lt; mx-delta&lt;br&gt;
&amp;gt; &amp;gt;       maxtab = [maxtab ; mxpos mx];&lt;br&gt;
&amp;gt; &amp;gt;       mn = this; mnpos = i;&lt;br&gt;
&amp;gt; &amp;gt;       lookformax = 0;&lt;br&gt;
&amp;gt; &amp;gt;     end  &lt;br&gt;
&amp;gt; &amp;gt;   else&lt;br&gt;
&amp;gt; &amp;gt;     if this &amp;gt; mn+delta&lt;br&gt;
&amp;gt; &amp;gt;       mintab = [mintab ; mnpos mn];&lt;br&gt;
&amp;gt; &amp;gt;       mx = this; mxpos = i;&lt;br&gt;
&amp;gt; &amp;gt;       lookformax = 1;&lt;br&gt;
&amp;gt; &amp;gt;     end&lt;br&gt;
&amp;gt; &amp;gt;   end&lt;br&gt;
&amp;gt; &amp;gt; end&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; index=2:length(v)-1;&lt;br&gt;
&amp;gt; MAX_pos=find(v(i-1)+delta&amp;lt;v(i) &amp; v(i+1)+delta&amp;lt;v(i))+1;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; for finding the minima you'll shurely find a similar&lt;br&gt;
solution :-)&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Lothar&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
so those 2 lines do the same as most of that code? nice.&lt;br&gt;
&lt;br&gt;
I am keen to get it to handle an arbitrary number of vectors&lt;br&gt;
in matrix form as currently it can only handle single&lt;br&gt;
vectors. As such I have been looping the whole function for&lt;br&gt;
each vector which is slow. could you show me how to adapt&lt;br&gt;
your vectorised version to allow this please? thanks.</description>
    </item>
  </channel>
</rss>

