help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 3D array index as the element itself?


From: John W. Eaton
Subject: Re: 3D array index as the element itself?
Date: Wed, 18 Apr 2007 18:09:19 -0400

On 18-Apr-2007, Jordi Gutierrez Hermoso wrote:

| I love these vectorisation puzzles! :-)
| 
| On 18/04/07, Temp Orary <address@hidden> wrote:
| > I'm a user using octave not on a daily basis but only sparcely. Something
| > came up to me that I believe is very easy to vectorize (if you are a
| > frequent user of octave) but it's not so obvious to me. So here it is:
| >
| > for i=1:3
| >   for j=1:3
| >     for k=1:3
| >       r(i,j,k, 1)=i;
| >       r(i,j,k, 2)=j;
| >       r(i,j,k, 3)=k;
| >     endfor
| >   endfor
| > endfor
| 
| The meshgrid available in Debian's octave2.9-forge package (which I
| imagine must be the same meshgrid in the actual 'Forge pages) makes
| this problem trivially simple to solve. The one in the octave2.1-forge
| package doesn't seem to have this functionality for 3d arrays...
| 
|      octave2.9:1> r = zeros(50,50,50); # Too large of an r, and all
|                                        # memory gets chewed up!
| 
|      octave2.9:2> i = 1:size(r,1);
|      octave2.9:3> j = 1:size(r,2);
|      octave2.9:4> k = 1:size(r,3);
| 
|      octave2.9:5> [iii,jjj,kkk] = meshgrid(i,j,k);
| 
|      octave2.9:6> r(:,:,:,2) = iii; # Note how seemingly Octave
|                                     #forge's meshgrid flips i and j.
|      octave2.9:7> r(:,:,:,1) = jjj;
|      octave2.9:8> r(:,:,:,3) = kkk; # This variable name means
|      nothing.
| 
|      octave2.9:9> r(3,42,5,2) ## Debugging...
|      ans =  42
|      octave2.9:10> r(3,42,5,1)
|      ans =  3
|      octave2.9:11> r(3,42,5,3)
|      ans =  5
| 
| I'm not quite sure why you would want to have a creature like r
| running around... It seems to be too big to be easily managed and not
| useful enough to justify its size.

I'm not sure that this is what the OP really wants, but this works in
2.9.10:

  tmp(1,1,1,:) = 1:3;
  r = repmat (tmp, [3,3,3])

you can use any dimensions, not just [3,3,3] here.

Do you realize that 512x512x512x3 requires 3GB of memory?  Octave
won't be able to handle an array of that size on a 32-bit system.
Also, since it is just a lot of repeated values, it seems somewhat
pointless to store it.

jwe


reply via email to

[Prev in Thread] Current Thread [Next in Thread]