<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169146</link>
    <title>MATLAB Central Newsreader - multidimensional indexing</title>
    <description>Feed for thread: multidimensional indexing</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2008 by The 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>The MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Tue, 13 May 2008 04:46:03 -0400</pubDate>
      <title>multidimensional indexing</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169146#431705</link>
      <author>Darius </author>
      <description>Hi,&lt;br&gt;
&lt;br&gt;
I'm looking for a sort of generalization of diag for &lt;br&gt;
multidimensional arrays.  Specifically suppose I have:&lt;br&gt;
&lt;br&gt;
A(:,:,1) = [1 2 3; 1 2 3; 1 2 3];&lt;br&gt;
&lt;br&gt;
A(:,:,2) = [4 5 6; 4 5 6; 4 5 6];&lt;br&gt;
&lt;br&gt;
A(:,:,3) = [7 8 9; 7 8 9; 7 8 9];&lt;br&gt;
&lt;br&gt;
Is there a quick way to get&lt;br&gt;
&lt;br&gt;
B = [1 5 9; 1 5 9; 1 5 9], so the first column of B is the &lt;br&gt;
first column of the first page, the second column is the &lt;br&gt;
second column of the second page, etc? (avoiding for &lt;br&gt;
loops) Thanks!&lt;br&gt;
&lt;br&gt;
</description>
    </item>
    <item>
      <pubDate>Tue, 13 May 2008 05:14:04 -0400</pubDate>
      <title>Re: multidimensional indexing</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169146#431710</link>
      <author>helper </author>
      <description>"Darius " &amp;lt;martin@econ.ucsb.edu&amp;gt; wrote in message &lt;br&gt;
&amp;lt;g0b6eb$18j$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Hi,&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I'm looking for a sort of generalization of diag for &lt;br&gt;
&amp;gt; multidimensional arrays.  Specifically suppose I have:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A(:,:,1) = [1 2 3; 1 2 3; 1 2 3];&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A(:,:,2) = [4 5 6; 4 5 6; 4 5 6];&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A(:,:,3) = [7 8 9; 7 8 9; 7 8 9];&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Is there a quick way to get&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; B = [1 5 9; 1 5 9; 1 5 9], so the first column of B is &lt;br&gt;
the &lt;br&gt;
&amp;gt; first column of the first page, the second column is the &lt;br&gt;
&amp;gt; second column of the second page, etc? (avoiding for &lt;br&gt;
&amp;gt; loops) Thanks!&lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
One of many methods:&lt;br&gt;
&lt;br&gt;
i = repmat((1:size(A,1)),size(A,1),1);&lt;br&gt;
I = sub2ind(size(A),i.',i,i);&lt;br&gt;
A(I)&lt;br&gt;
</description>
    </item>
    <item>
      <pubDate>Tue, 13 May 2008 08:12:02 -0400</pubDate>
      <title>Re: multidimensional indexing</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169146#431731</link>
      <author>us</author>
      <description>"Darius ":&lt;br&gt;
&amp;lt;SNIP repeating his/her ND-diag...&lt;br&gt;
&lt;br&gt;
one of the many solutions&lt;br&gt;
&lt;br&gt;
% the data&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m=reshape(1:27,[3,3,3])&lt;br&gt;
% the engine&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r=ones(3,1)*arrayfun(@(x) m(x,x,x),1:3)&lt;br&gt;
%{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r=&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 14 27&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 14 27&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 14 27&lt;br&gt;
%}&lt;br&gt;
&lt;br&gt;
us&lt;br&gt;
</description>
    </item>
    <item>
      <pubDate>Tue, 13 May 2008 12:30:20 -0400</pubDate>
      <title>Re: multidimensional indexing</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169146#431781</link>
      <author>helper </author>
      <description>"us " &amp;lt;us@neurol.unizh.ch&amp;gt; wrote in message &amp;lt;g0bigi$cp3&lt;br&gt;
$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; "Darius ":&lt;br&gt;
&amp;gt; &amp;lt;SNIP repeating his/her ND-diag...&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; one of the many solutions&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % the data&lt;br&gt;
&amp;gt;      m=reshape(1:27,[3,3,3])&lt;br&gt;
&amp;gt; % the engine&lt;br&gt;
&amp;gt;      r=ones(3,1)*arrayfun(@(x) m(x,x,x),1:3)&lt;br&gt;
&amp;gt; %{&lt;br&gt;
&amp;gt;      r=&lt;br&gt;
&amp;gt;      1 14 27&lt;br&gt;
&amp;gt;      1 14 27&lt;br&gt;
&amp;gt;      1 14 27&lt;br&gt;
&amp;gt; %}&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; us&lt;br&gt;
&lt;br&gt;
Ah but this doesn't quite satisfy his request which is the &lt;br&gt;
equivalent to:&lt;br&gt;
&lt;br&gt;
r = [m(:,1,1) m(:,2,2) m(:,3,3)];&lt;br&gt;
&lt;br&gt;
This would require the following change to your code:&lt;br&gt;
&lt;br&gt;
r=cell2mat(arrayfun(@(x) m(:,x,x),1:3,'uni',false));&lt;br&gt;
&lt;br&gt;
And, of course the comparison between the methods (and an &lt;br&gt;
additional one using FOR-loops):&lt;br&gt;
&lt;br&gt;
% The data&lt;br&gt;
N = 100;&lt;br&gt;
m = rand(N,N,N);&lt;br&gt;
t = {'helper'; 'us'; 'FOR-loops'};&lt;br&gt;
&lt;br&gt;
% The tests&lt;br&gt;
tic&lt;br&gt;
for n = 1:1000&lt;br&gt;
i = repmat((1:size(m,1)),size(m,1),1);&lt;br&gt;
I = sub2ind(size(m),i.',i,i);&lt;br&gt;
r = m(I);&lt;br&gt;
end&lt;br&gt;
t{1,2} = toc;&lt;br&gt;
&lt;br&gt;
tic&lt;br&gt;
for n = 1:1000&lt;br&gt;
r = cell2mat(arrayfun(@(x) m(:,x,x),1:3,'uni',false));&lt;br&gt;
end&lt;br&gt;
t{2,2} = toc;&lt;br&gt;
&lt;br&gt;
tic&lt;br&gt;
for n = 1:1000&lt;br&gt;
&amp;nbsp;&amp;nbsp;r = zeros(N,N);&lt;br&gt;
&amp;nbsp;&amp;nbsp;for j = 1:N&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r(:,j) = m(:,j,j);&lt;br&gt;
&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
t{3,2} = toc;&lt;br&gt;
&lt;br&gt;
disp(t)&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'helper'       [1.1061]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'us'           [0.5106]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'FOR-loops'    [0.2666] % The winner&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
FOR-loops win again!&lt;br&gt;
</description>
    </item>
    <item>
      <pubDate>Tue, 13 May 2008 13:06:03 -0400</pubDate>
      <title>Re: multidimensional indexing</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169146#431785</link>
      <author>us</author>
      <description>"helper ":&lt;br&gt;
&amp;lt;SNIP scolding &amp;lt;us&amp;gt;'s solution... :-)&lt;br&gt;
&lt;br&gt;
&amp;gt; Ah but this doesn't quite satisfy his request which is &lt;br&gt;
the equivalent to:&lt;br&gt;
&amp;gt; r = [m(:,1,1) m(:,2,2) m(:,3,3)];&lt;br&gt;
&lt;br&gt;
&amp;lt;helper&amp;gt;, i couldn't agree more! - but then: i looked at &lt;br&gt;
the OP's example, in particular his/her (ambiguous?) &lt;br&gt;
solution&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;B = [1 5 9; 1 5 9; 1 5 9]&lt;br&gt;
%{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 5 9&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 5 9&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 5 9&lt;br&gt;
%}&lt;br&gt;
&lt;br&gt;
that had me come up with the &amp;lt;repeating his/her ND-&lt;br&gt;
diag...&amp;gt;...&lt;br&gt;
but again, you're most likely correct! - in which case &lt;br&gt;
another solution might look like this&lt;br&gt;
&lt;br&gt;
% the data&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m=repmat(magic(3),[1,1,3]);&lt;br&gt;
% the engine&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r=reshape(m,size(m,1),[]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r=r(:,1:size(m,2)+1:end)&lt;br&gt;
%{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8 1 6&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3 5 7&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4 9 2&lt;br&gt;
%}&lt;br&gt;
&lt;br&gt;
now, using your nice timing snippet (below), things look &lt;br&gt;
like this on a wintel: ic2/2*2.4mhz/2g/winxp.sp2/r2007b)&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'helper'       [0.77992]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'us'           [0.054153]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'FOR-loops'    [0.21931]&lt;br&gt;
&lt;br&gt;
again, just for fun :-)&lt;br&gt;
us&lt;br&gt;
&lt;br&gt;
% The data&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N = 100;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m = rand(N,N,N);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = {'helper'; 'us'; 'FOR-loops'};&lt;br&gt;
&lt;br&gt;
% helper&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tic&lt;br&gt;
for  n = 1:1000&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i = repmat((1:size(m,1)),size(m,1),1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I = sub2ind(size(m),i.',i,i);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = m(I);&lt;br&gt;
end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t{1,2} = toc;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r1=r;&lt;br&gt;
% us&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tic&lt;br&gt;
for  n = 1:1000&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r=reshape(m,size(m,1),[]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r=r(:,1:size(m,2)+1:end);&lt;br&gt;
end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t{2,2} = toc;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r2=r;&lt;br&gt;
% loop&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tic&lt;br&gt;
for  n = 1:1000&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = zeros(N,N);&lt;br&gt;
for  j = 1:N&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r(:,j) = m(:,j,j);&lt;br&gt;
end&lt;br&gt;
end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t{3,2} = toc;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r3=r;&lt;br&gt;
isequal(r1,r2,r3)&lt;br&gt;
% ans = 1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;disp(t)&lt;br&gt;
</description>
    </item>
    <item>
      <pubDate>Tue, 13 May 2008 15:59:04 -0400</pubDate>
      <title>Re: multidimensional indexing</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/169146#431840</link>
      <author>Darius </author>
      <description>Thank you all!  There's still so much to learn.&lt;br&gt;
&lt;br&gt;
"us " &amp;lt;us@neurol.unizh.ch&amp;gt; wrote in message &lt;br&gt;
&amp;lt;g0c3nr$78u$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; "helper ":&lt;br&gt;
&amp;gt; &amp;lt;SNIP scolding &amp;lt;us&amp;gt;'s solution... :-)&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Ah but this doesn't quite satisfy his request which is &lt;br&gt;
&amp;gt; the equivalent to:&lt;br&gt;
&amp;gt; &amp;gt; r = [m(:,1,1) m(:,2,2) m(:,3,3)];&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;lt;helper&amp;gt;, i couldn't agree more! - but then: i looked at &lt;br&gt;
&amp;gt; the OP's example, in particular his/her (ambiguous?) &lt;br&gt;
&amp;gt; solution&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;      B = [1 5 9; 1 5 9; 1 5 9]&lt;br&gt;
&amp;gt; %{&lt;br&gt;
&amp;gt;      1 5 9&lt;br&gt;
&amp;gt;      1 5 9&lt;br&gt;
&amp;gt;      1 5 9&lt;br&gt;
&amp;gt; %}&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; that had me come up with the &amp;lt;repeating his/her ND-&lt;br&gt;
&amp;gt; diag...&amp;gt;...&lt;br&gt;
&amp;gt; but again, you're most likely correct! - in which case &lt;br&gt;
&amp;gt; another solution might look like this&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % the data&lt;br&gt;
&amp;gt;      m=repmat(magic(3),[1,1,3]);&lt;br&gt;
&amp;gt; % the engine&lt;br&gt;
&amp;gt;      r=reshape(m,size(m,1),[]);&lt;br&gt;
&amp;gt;      r=r(:,1:size(m,2)+1:end)&lt;br&gt;
&amp;gt; %{&lt;br&gt;
&amp;gt;      8 1 6&lt;br&gt;
&amp;gt;      3 5 7&lt;br&gt;
&amp;gt;      4 9 2&lt;br&gt;
&amp;gt; %}&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; now, using your nice timing snippet (below), things look &lt;br&gt;
&amp;gt; like this on a wintel: ic2/2*2.4mhz/2g/winxp.sp2/r2007b)&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;      'helper'       [0.77992]&lt;br&gt;
&amp;gt;      'us'           [0.054153]&lt;br&gt;
&amp;gt;      'FOR-loops'    [0.21931]&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; again, just for fun :-)&lt;br&gt;
&amp;gt; us&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % The data&lt;br&gt;
&amp;gt;      N = 100;&lt;br&gt;
&amp;gt;      m = rand(N,N,N);&lt;br&gt;
&amp;gt;      t = {'helper'; 'us'; 'FOR-loops'};&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % helper&lt;br&gt;
&amp;gt;      tic&lt;br&gt;
&amp;gt; for  n = 1:1000&lt;br&gt;
&amp;gt;      i = repmat((1:size(m,1)),size(m,1),1);&lt;br&gt;
&amp;gt;      I = sub2ind(size(m),i.',i,i);&lt;br&gt;
&amp;gt;      r = m(I);&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt;      t{1,2} = toc;&lt;br&gt;
&amp;gt;      r1=r;&lt;br&gt;
&amp;gt; % us&lt;br&gt;
&amp;gt;      tic&lt;br&gt;
&amp;gt; for  n = 1:1000&lt;br&gt;
&amp;gt;      r=reshape(m,size(m,1),[]);&lt;br&gt;
&amp;gt;      r=r(:,1:size(m,2)+1:end);&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt;      t{2,2} = toc;&lt;br&gt;
&amp;gt;      r2=r;&lt;br&gt;
&amp;gt; % loop&lt;br&gt;
&amp;gt;      tic&lt;br&gt;
&amp;gt; for  n = 1:1000&lt;br&gt;
&amp;gt;      r = zeros(N,N);&lt;br&gt;
&amp;gt; for  j = 1:N&lt;br&gt;
&amp;gt;      r(:,j) = m(:,j,j);&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt;      t{3,2} = toc;&lt;br&gt;
&amp;gt;      r3=r;&lt;br&gt;
&amp;gt; isequal(r1,r2,r3)&lt;br&gt;
&amp;gt; % ans = 1&lt;br&gt;
&amp;gt;      disp(t)&lt;br&gt;
&lt;br&gt;
</description>
    </item>
  </channel>
</rss>
