[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;
}