<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235988</link>
    <title>MATLAB Central Newsreader - Vectorizing Specific Access to Multidimensional Array</title>
    <description>Feed for thread: Vectorizing Specific Access to Multidimensional Array</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, 14 Sep 2008 06:08:03 -0400</pubDate>
      <title>Vectorizing Specific Access to Multidimensional Array</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235988#600257</link>
      <author>First Last</author>
      <description>Let's say I have a NxMxL array X where N = M = L = 2:&lt;br&gt;
&lt;br&gt;
X(:,:,1) = &lt;br&gt;
&lt;br&gt;
1 3&lt;br&gt;
2 4&lt;br&gt;
&lt;br&gt;
X(:,:,2) = &lt;br&gt;
&lt;br&gt;
5 7&lt;br&gt;
6 8&lt;br&gt;
&lt;br&gt;
For each vector along L ([1 5], [3 7], etc.), I want to pick a random element of it (in this case either the first or second element). One 'dumb' way of doing this is:&lt;br&gt;
&lt;br&gt;
z = zeros(2,2,2);&lt;br&gt;
&lt;br&gt;
for n = 1:N&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for m = 1:M&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v = floor(1 + 2 * rand(1,1));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;z(n,m,v) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
The resulting matrix z will end up looking something like, say:&lt;br&gt;
&lt;br&gt;
z(:,:,1) = &lt;br&gt;
&lt;br&gt;
1 0&lt;br&gt;
0 1&lt;br&gt;
&lt;br&gt;
z(:,:,2) = &lt;br&gt;
&lt;br&gt;
0 1&lt;br&gt;
1 0&lt;br&gt;
&lt;br&gt;
and X .* z is&lt;br&gt;
&lt;br&gt;
(:,:,1) = &lt;br&gt;
&lt;br&gt;
1 0&lt;br&gt;
0 4&lt;br&gt;
&lt;br&gt;
(:,:,2) = &lt;br&gt;
&lt;br&gt;
0 7&lt;br&gt;
6 0&lt;br&gt;
&lt;br&gt;
so that sum(X .* z,3) = &lt;br&gt;
&lt;br&gt;
1 7&lt;br&gt;
6 4&lt;br&gt;
&lt;br&gt;
Is there any way to create a random matrix z directly so that I can avoid those loops? &lt;br&gt;
&lt;br&gt;
Better yet, is there a way to read a random matrix R that has the elements&lt;br&gt;
&lt;br&gt;
R = floor(1 + 2 * rand(2,2));&lt;br&gt;
&lt;br&gt;
which might look like&lt;br&gt;
&lt;br&gt;
1 2&lt;br&gt;
2 1&lt;br&gt;
&lt;br&gt;
that I could use to directly access elements of X, using R along the dimension L?&lt;br&gt;
&lt;br&gt;
I realize this may be very confusing. Of course I'm happy to clarify anything I can. Thanks. </description>
    </item>
    <item>
      <pubDate>Sun, 14 Sep 2008 06:48:02 -0400</pubDate>
      <title>Re: Vectorizing Specific Access to Multidimensional Array</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235988#600260</link>
      <author>Bruno Luong</author>
      <description>&quot;First Last&quot; &amp;lt;nospam@nospamplease.com&amp;gt; wrote in message &amp;lt;gai9o3$fer$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&lt;br&gt;
Not sure if this is what you want. The function that you need is &quot;sub2ind&quot;.&lt;br&gt;
&lt;br&gt;
% Data&lt;br&gt;
M=3; N=4; L=5;&lt;br&gt;
X=ceil(10*rand(M,N,L));&lt;br&gt;
&lt;br&gt;
[i j]=ndgrid(1:M,1:N);&lt;br&gt;
% random pick of index from  to L&lt;br&gt;
k = floor(1 + L * rand(size(i)));&lt;br&gt;
k(k&amp;gt;L) = L; % clip incase rand returns &quot;1&quot;&lt;br&gt;
&lt;br&gt;
linind = sub2ind(size(X),i(:),j(:),k(:));&lt;br&gt;
&lt;br&gt;
% Generate z&lt;br&gt;
z=zeros(size(X));&lt;br&gt;
z(linind)=1;&lt;br&gt;
sum(X.*z,3)&lt;br&gt;
&lt;br&gt;
% Access X directly&lt;br&gt;
Y = X(reshape(linind,size(i)))&lt;br&gt;
&lt;br&gt;
% Bruno</description>
    </item>
    <item>
      <pubDate>Sun, 14 Sep 2008 07:09:02 -0400</pubDate>
      <title>Re: Vectorizing Specific Access to Multidimensional Array</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235988#600261</link>
      <author>Bruno Luong</author>
      <description>&quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in message &amp;lt;gaic32$st9$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&lt;br&gt;
&amp;gt; k = floor(1 + L * rand(size(i)));&lt;br&gt;
&amp;gt; k(k&amp;gt;L) = L; % clip in case RAND returns &quot;1&quot;&lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
Note: the clipping statement might not be necessary, as rand never return 1. The floor(L*(1-eps)) always returns L-1 is something I wasn't sure, but this might be right. Someone can confirm?&lt;br&gt;
&lt;br&gt;
Bruno</description>
    </item>
    <item>
      <pubDate>Sun, 14 Sep 2008 07:46:02 -0400</pubDate>
      <title>Re: Vectorizing Specific Access to Multidimensional Array</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/235988#600262</link>
      <author>First Last</author>
      <description>&quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in message &amp;lt;gaic32$st9$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &quot;First Last&quot; &amp;lt;nospam@nospamplease.com&amp;gt; wrote in message &amp;lt;gai9o3$fer$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Not sure if this is what you want. The function that you need is &quot;sub2ind&quot;.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % Data&lt;br&gt;
&amp;gt; M=3; N=4; L=5;&lt;br&gt;
&amp;gt; X=ceil(10*rand(M,N,L));&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; [i j]=ndgrid(1:M,1:N);&lt;br&gt;
&amp;gt; % random pick of index from  to L&lt;br&gt;
&amp;gt; k = floor(1 + L * rand(size(i)));&lt;br&gt;
&amp;gt; k(k&amp;gt;L) = L; % clip incase rand returns &quot;1&quot;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; linind = sub2ind(size(X),i(:),j(:),k(:));&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % Generate z&lt;br&gt;
&amp;gt; z=zeros(size(X));&lt;br&gt;
&amp;gt; z(linind)=1;&lt;br&gt;
&amp;gt; sum(X.*z,3)&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % Access X directly&lt;br&gt;
&amp;gt; Y = X(reshape(linind,size(i)))&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % Bruno&lt;br&gt;
&lt;br&gt;
This solution is perfect. Thanks very much. You have saved my department's electricity bill and my sanity! </description>
    </item>
  </channel>
</rss>

