<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/155890</link>
    <title>MATLAB Central Newsreader - find indices when using accumarray</title>
    <description>Feed for thread: find indices when using accumarray</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>Mon, 10 Sep 2007 14:56:38 -0400</pubDate>
      <title>find indices when using accumarray</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/155890#391484</link>
      <author>Wolfgang Schwanghart</author>
      <description>Dear community,&lt;br&gt;
&lt;br&gt;
I got a problem using accumarray&lt;br&gt;
&lt;br&gt;
ind = [1 2 3 1 2 3 1 2 3]';&lt;br&gt;
val = [0.1:0.1:0.9]';&lt;br&gt;
A = accumarray(ind,val,[3 1],@max)&lt;br&gt;
A =&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.7000&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.8000&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.9000&lt;br&gt;
&lt;br&gt;
Now I don't want the maximum value but the index in val,&lt;br&gt;
where the maximum is found. So I wrote my own function...&lt;br&gt;
_________________________&lt;br&gt;
function ix = findmax(s);&lt;br&gt;
[m,ix] = max(s);&lt;br&gt;
_________________________&lt;br&gt;
&lt;br&gt;
... and entered:&lt;br&gt;
&lt;br&gt;
A = accumarray(ind,val,[3 1],@findmax)&lt;br&gt;
&lt;br&gt;
A =&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&lt;br&gt;
&lt;br&gt;
I don't know what A is telling me now but obviously it is&lt;br&gt;
not what I wanted. I want A to be&lt;br&gt;
&lt;br&gt;
A = [7 8 9]';&lt;br&gt;
&lt;br&gt;
Is there a way to do so (without using sparse matrices?)&lt;br&gt;
&lt;br&gt;
Best regards and thanks,&lt;br&gt;
Wolfgang</description>
    </item>
    <item>
      <pubDate>Mon, 10 Sep 2007 19:14:19 -0400</pubDate>
      <title>Re: find indices when using accumarray</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/155890#391521</link>
      <author>Peter Perkins</author>
      <description>Wolfgang Schwanghart wrote:&lt;br&gt;
&lt;br&gt;
&amp;gt; A = accumarray(ind,val,[3 1],@findmax)&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A =&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;      1&lt;br&gt;
&amp;gt;      2&lt;br&gt;
&amp;gt;      2&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I don't know what A is telling me now but obviously it is&lt;br&gt;
&amp;gt; not what I wanted.&lt;br&gt;
&lt;br&gt;
It may not be what you wanted, but it is waht you asked for.  To see why, do this:&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;gt;&amp;gt; A = accumarray(ind,val,[3 1],@(x) {x})&lt;br&gt;
A =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[3x1 double]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[3x1 double]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[3x1 double]&lt;br&gt;
&amp;nbsp;&amp;gt;&amp;gt; A{:}&lt;br&gt;
ans =&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;0.7&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;0.4&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;0.1&lt;br&gt;
ans =&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;0.5&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;0.8&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;0.2&lt;br&gt;
ans =&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;0.3&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;0.9&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;0.6&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
accumarray has returned the index _within the first group_ of the max of the &lt;br&gt;
first group, and so on.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;gt; I want A to be&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A = [7 8 9]';&lt;br&gt;
&lt;br&gt;
You're asking accumarray to compute a function that cannot be computed using &lt;br&gt;
only using the values in each of the groups -- to compute what you want, you &lt;br&gt;
also need to know the positions in the original data, and that information is &lt;br&gt;
lost by the time the information gets to your findmax function.&lt;br&gt;
&lt;br&gt;
You could take the output that you got using @max, and do a series of finds on &lt;br&gt;
the original data.&lt;br&gt;
&lt;br&gt;
Or, and I'm not saying that I recommend this, here's a too-clever way to use an &lt;br&gt;
input that encodes both the value, and the position:&lt;br&gt;
&lt;br&gt;
val2 = complex(val,(1:9)');&lt;br&gt;
&amp;nbsp;&amp;gt;&amp;gt; A = accumarray(ind,val2,[3 1],@tmp)&lt;br&gt;
A =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
where&lt;br&gt;
&lt;br&gt;
function y = tmp(x)&lt;br&gt;
[dum,i] = max(real(x));&lt;br&gt;
y = imag(x(i));</description>
    </item>
    <item>
      <pubDate>Mon, 03 Mar 2008 16:10:27 -0500</pubDate>
      <title>Re: find indices when using accumarray</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/155890#418724</link>
      <author>Ilya Rozenfeld</author>
      <description>I saw your question on the Loren's blog but I decided to &lt;br&gt;
answer here since it seems to be a more proper forum.  &lt;br&gt;
Anyway, how about something like this&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
A = accumarray(ind, 1:numel(val) ,[3 1], @(x) findmax&lt;br&gt;
(x,val))&lt;br&gt;
&lt;br&gt;
where&lt;br&gt;
&lt;br&gt;
function ix = findmax(indx, s)&lt;br&gt;
[m,ix] = max(s(indx));&lt;br&gt;
ix =  indx(ix);&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&quot;Wolfgang Schwanghart&quot; &amp;lt;schwanghart@googlemail.com&amp;gt; wrote &lt;br&gt;
in message &amp;lt;fc3lv6$ovb$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Dear community,&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I got a problem using accumarray&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; ind = [1 2 3 1 2 3 1 2 3]';&lt;br&gt;
&amp;gt; val = [0.1:0.1:0.9]';&lt;br&gt;
&amp;gt; A = accumarray(ind,val,[3 1],@max)&lt;br&gt;
&amp;gt; A =&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;     0.7000&lt;br&gt;
&amp;gt;     0.8000&lt;br&gt;
&amp;gt;     0.9000&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Now I don't want the maximum value but the index in val,&lt;br&gt;
&amp;gt; where the maximum is found. So I wrote my own function...&lt;br&gt;
&amp;gt; _________________________&lt;br&gt;
&amp;gt; function ix = findmax(s);&lt;br&gt;
&amp;gt; [m,ix] = max(s);&lt;br&gt;
&amp;gt; _________________________&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; ... and entered:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A = accumarray(ind,val,[3 1],@findmax)&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A =&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;      1&lt;br&gt;
&amp;gt;      2&lt;br&gt;
&amp;gt;      2&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I don't know what A is telling me now but obviously it is&lt;br&gt;
&amp;gt; not what I wanted. I want A to be&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A = [7 8 9]';&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Is there a way to do so (without using sparse matrices?)&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Best regards and thanks,&lt;br&gt;
&amp;gt; Wolfgang&lt;br&gt;
&amp;gt; </description>
    </item>
    <item>
      <pubDate>Mon, 03 Mar 2008 21:25:14 -0500</pubDate>
      <title>Re: find indices when using accumarray</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/155890#418776</link>
      <author>Wolfgang Schwanghart</author>
      <description>Hi Ilya,&lt;br&gt;
&lt;br&gt;
I am deeply impressed. Thanks a lot, this worked out.&lt;br&gt;
&lt;br&gt;
Best regards,&lt;br&gt;
Wolfgang&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&quot;Ilya Rozenfeld&quot; &amp;lt;rozeni.nospam@alum.rpi.edu&amp;gt; wrote in&lt;br&gt;
message &amp;lt;fqh7tj$oea$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; I saw your question on the Loren's blog but I decided to &lt;br&gt;
&amp;gt; answer here since it seems to be a more proper forum.  &lt;br&gt;
&amp;gt; Anyway, how about something like this&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A = accumarray(ind, 1:numel(val) ,[3 1], @(x) findmax&lt;br&gt;
&amp;gt; (x,val))&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; where&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; function ix = findmax(indx, s)&lt;br&gt;
&amp;gt; [m,ix] = max(s(indx));&lt;br&gt;
&amp;gt; ix =  indx(ix);&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &quot;Wolfgang Schwanghart&quot; &amp;lt;schwanghart@googlemail.com&amp;gt; wrote &lt;br&gt;
&amp;gt; in message &amp;lt;fc3lv6$ovb$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; Dear community,&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; I got a problem using accumarray&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; ind = [1 2 3 1 2 3 1 2 3]';&lt;br&gt;
&amp;gt; &amp;gt; val = [0.1:0.1:0.9]';&lt;br&gt;
&amp;gt; &amp;gt; A = accumarray(ind,val,[3 1],@max)&lt;br&gt;
&amp;gt; &amp;gt; A =&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt;     0.7000&lt;br&gt;
&amp;gt; &amp;gt;     0.8000&lt;br&gt;
&amp;gt; &amp;gt;     0.9000&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Now I don't want the maximum value but the index in val,&lt;br&gt;
&amp;gt; &amp;gt; where the maximum is found. So I wrote my own function...&lt;br&gt;
&amp;gt; &amp;gt; _________________________&lt;br&gt;
&amp;gt; &amp;gt; function ix = findmax(s);&lt;br&gt;
&amp;gt; &amp;gt; [m,ix] = max(s);&lt;br&gt;
&amp;gt; &amp;gt; _________________________&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; ... and entered:&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; A = accumarray(ind,val,[3 1],@findmax)&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; A =&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt;      1&lt;br&gt;
&amp;gt; &amp;gt;      2&lt;br&gt;
&amp;gt; &amp;gt;      2&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; I don't know what A is telling me now but obviously it is&lt;br&gt;
&amp;gt; &amp;gt; not what I wanted. I want A to be&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; A = [7 8 9]';&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Is there a way to do so (without using sparse matrices?)&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Best regards and thanks,&lt;br&gt;
&amp;gt; &amp;gt; Wolfgang&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; </description>
    </item>
  </channel>
</rss>

