help-octave
[Top][All Lists]
Advanced

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

Re: Toy NDArray example


From: David Bateman
Subject: Re: Toy NDArray example
Date: Thu, 19 Jan 2006 10:52:25 +0100
User-agent: Mozilla Thunderbird 1.0.2 (Windows/20050317)

Keith Goodman a écrit :

On 1/18/06, David Bateman <address@hidden> wrote:
> I'd think the following example is something like what you want

Nice example. Thank you. Pairing a bunch of toy m-functions with the
corresponding oct-functions would make a nice document.


You should look at the oct-file programming documents of Christophe Spiel (http://octave.sourceforge.net/coda/coda.pdf) and Paul Thomas (http://perso.wanadoo.fr/prthomas/intro.html). Essentially, I believe what you discuss is already pretty well discussed there, so I don't see the need for further effort to write something new.

Since I can only index a NDArray with a single index, how do I pull
out an entire 2D slice of a 3D array?

n = [3 2 4];
x = rand(n);

I want y = x(:,:,j), so in an oct function would I have to do the equivalent of

ind = (j - 1)*n(1)*n(2) + (1:(n(1)*n(2)));
y = x(ind);
y = reshape(x,n(1),n(2));

or if reshape is not available loop over the rows and columns of y?

With idx_vector's in an oct-file you can do this. But not very efficiently. The thread

http://www.octave.org/octave-lists/archive/help-octave.2005/msg00328.html

is probably of interest in this case. However, for the case you have here, due the fortran style indexing of octave matrices, what you want to do can be easily implemented as in the attached file

D.


#include <oct.h>

DEFUN_DLD(ndarraytoy, args, nargout, "y = ndarraytoy(x, j).")
{
  int nargin = args.length ();
  octave_value retval;

  // Important to check the number of arguments as if incorrect will seg-fault
  if (nargin != 2)
    {
      print_usage ("ndarraytoy");
      return retval;
    }

  // input matrix x is 3D. Define const so we don't make a copy later
  const NDArray x = args(0).array_value();
  octave_idx_type j = args(1).int_value() - 1;

  if (!error_state)
    {
      // Ok it was an NDArray

      //Note if  2.1.x need  int instead of octave_idx_type
      dim_vector dv = x.dims();
      
      if (dv.length() < 3 || j < 0 || j >= dv(2))
        error ("ndarrytoy: index out of range");
      else
        {
          // Define output NDArray
          NDArray y(dim_vector(dv(0),dv(1)));
          octave_idx_type len = y.length();
          octave_idx_type offset = len * j;
          std::cerr << "len,offset: " << len << " " << offset << "\n";
                
          // Can only loop over one index value for NDArray. 
          for (octave_idx_type i = 0; i < len; i++) 
            y(i) = x(i+offset);         

          retval = y;
        }
    }
  return retval;
}




reply via email to

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