class NArray
initialization of NArray Class
Constants
- BYTE
- CLASS_DIMENSION
- COMPLEX
- DCOMPLEX
- DFLOAT
- ENDIAN
- FLOAT
- INT
- LINT
- NARRAY_VERSION
- NONE
- OBJECT
- ROBJ
- SCOMPLEX
- SFLOAT
- SINT
Public Class Methods
Source
static VALUE
na_s_bracket(int argc, VALUE *argv, VALUE klass)
{
VALUE v = rb_ary_new4(argc, argv);
return na_ary_to_nary( v, klass );
}
singleton method: NArray
Source
static VALUE
na_s_new_byte(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_BYTE, klass); }
/* class method: sint(size1,size2,...,sizeN) */
static VALUE
na_s_new_sint(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SINT, klass); }
/* class method: int(size1,size2,...,sizeN) */
static VALUE
na_s_new_int(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_LINT, klass); }
/* class method: sfloat(size1,size2,...,sizeN) */
static VALUE
na_s_new_sfloat(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SFLOAT, klass); }
/* class method: float(size1,size2,...,sizeN) */
static VALUE
na_s_new_float(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DFLOAT, klass); }
/* class method: scomplex(size1,size2,...,sizeN) */
static VALUE
na_s_new_scomplex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SCOMPLEX, klass); }
/* class method: complex(size1,size2,...,sizeN) */
static VALUE
na_s_new_complex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DCOMPLEX, klass); }
/* class method: object(size1,size2,...,sizeN) */
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: byte(size1,size2,…,sizeN)
Source
static VALUE
na_s_new_complex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DCOMPLEX, klass); }
/* class method: object(size1,size2,...,sizeN) */
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: complex(size1,size2,…,sizeN)
Source
static VALUE
na_s_new_complex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DCOMPLEX, klass); }
/* class method: object(size1,size2,...,sizeN) */
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: complex(size1,size2,…,sizeN)
Source
static VALUE
na_s_new_float(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DFLOAT, klass); }
/* class method: scomplex(size1,size2,...,sizeN) */
static VALUE
na_s_new_scomplex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SCOMPLEX, klass); }
/* class method: complex(size1,size2,...,sizeN) */
static VALUE
na_s_new_complex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DCOMPLEX, klass); }
/* class method: object(size1,size2,...,sizeN) */
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: float(size1,size2,…,sizeN)
Source
static VALUE
na_s_new_float(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DFLOAT, klass); }
/* class method: scomplex(size1,size2,...,sizeN) */
static VALUE
na_s_new_scomplex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SCOMPLEX, klass); }
/* class method: complex(size1,size2,...,sizeN) */
static VALUE
na_s_new_complex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DCOMPLEX, klass); }
/* class method: object(size1,size2,...,sizeN) */
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: float(size1,size2,…,sizeN)
Source
static VALUE
na_s_new_int(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_LINT, klass); }
/* class method: sfloat(size1,size2,...,sizeN) */
static VALUE
na_s_new_sfloat(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SFLOAT, klass); }
/* class method: float(size1,size2,...,sizeN) */
static VALUE
na_s_new_float(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DFLOAT, klass); }
/* class method: scomplex(size1,size2,...,sizeN) */
static VALUE
na_s_new_scomplex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SCOMPLEX, klass); }
/* class method: complex(size1,size2,...,sizeN) */
static VALUE
na_s_new_complex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DCOMPLEX, klass); }
/* class method: object(size1,size2,...,sizeN) */
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: int(size1,size2,…,sizeN)
Source
static VALUE
na_s_new_int(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_LINT, klass); }
/* class method: sfloat(size1,size2,...,sizeN) */
static VALUE
na_s_new_sfloat(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SFLOAT, klass); }
/* class method: float(size1,size2,...,sizeN) */
static VALUE
na_s_new_float(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DFLOAT, klass); }
/* class method: scomplex(size1,size2,...,sizeN) */
static VALUE
na_s_new_scomplex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SCOMPLEX, klass); }
/* class method: complex(size1,size2,...,sizeN) */
static VALUE
na_s_new_complex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DCOMPLEX, klass); }
/* class method: object(size1,size2,...,sizeN) */
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: int(size1,size2,…,sizeN)
Source
static VALUE
na_s_new(int argc, VALUE *argv, VALUE klass)
{
if (argc == 0)
rb_raise(rb_eArgError, "Argument required");
return na_new2(argc-1, argv+1, na_get_typecode(argv[0]), klass);
}
class method: new(type, size1,size2,…,sizeN)
Source
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: object(size1,size2,…,sizeN)
Source
static VALUE
na_s_refer(VALUE klass, VALUE self)
{
return na_wrap_struct_class(na_ref_alloc_struct(self), klass);
}
singleton method: NArray.refer( other )
Source
static VALUE
na_s_refer(VALUE klass, VALUE self)
{
return na_wrap_struct_class(na_ref_alloc_struct(self), klass);
}
singleton method: NArray.refer( other )
Source
static VALUE
na_s_new_scomplex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SCOMPLEX, klass); }
/* class method: complex(size1,size2,...,sizeN) */
static VALUE
na_s_new_complex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DCOMPLEX, klass); }
/* class method: object(size1,size2,...,sizeN) */
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: scomplex(size1,size2,…,sizeN)
Source
static VALUE
na_s_new_sfloat(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SFLOAT, klass); }
/* class method: float(size1,size2,...,sizeN) */
static VALUE
na_s_new_float(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DFLOAT, klass); }
/* class method: scomplex(size1,size2,...,sizeN) */
static VALUE
na_s_new_scomplex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SCOMPLEX, klass); }
/* class method: complex(size1,size2,...,sizeN) */
static VALUE
na_s_new_complex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DCOMPLEX, klass); }
/* class method: object(size1,size2,...,sizeN) */
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: sfloat(size1,size2,…,sizeN)
Source
static VALUE
na_s_new_sint(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SINT, klass); }
/* class method: int(size1,size2,...,sizeN) */
static VALUE
na_s_new_int(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_LINT, klass); }
/* class method: sfloat(size1,size2,...,sizeN) */
static VALUE
na_s_new_sfloat(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SFLOAT, klass); }
/* class method: float(size1,size2,...,sizeN) */
static VALUE
na_s_new_float(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DFLOAT, klass); }
/* class method: scomplex(size1,size2,...,sizeN) */
static VALUE
na_s_new_scomplex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_SCOMPLEX, klass); }
/* class method: complex(size1,size2,...,sizeN) */
static VALUE
na_s_new_complex(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_DCOMPLEX, klass); }
/* class method: object(size1,size2,...,sizeN) */
static VALUE
na_s_new_object(int argc, VALUE *argv, VALUE klass)
{ return na_new2(argc, argv, NA_ROBJ, klass); }
/* method: dup() */
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
class method: sint(size1,size2,…,sizeN)
Source
static VALUE
na_s_to_na(int argc, VALUE *argv, VALUE klass)
{
if (argc < 1) {
rb_raise(rb_eArgError, "Argument is required");
}
if (TYPE(argv[0]) == T_STRING) {
return na_str_to_na(argc-1,argv+1,argv[0]);
}
if (argc > 1) {
rb_raise(rb_eArgError, "Only one array argument must be provided");
}
if (TYPE(argv[0]) == T_ARRAY) {
return na_ary_to_nary( argv[0], klass );
}
if (NA_IsNArray(argv[0])) {
return argv[0];
}
rb_raise(rb_eTypeError, "Argument must be Array or String (or NArray)");
return Qnil;
}
singleton method: NArray.to_na( string, type, size1,size2,…,sizeN ) NArray.to_na( array )
Source
static VALUE
na_s_to_na(int argc, VALUE *argv, VALUE klass)
{
if (argc < 1) {
rb_raise(rb_eArgError, "Argument is required");
}
if (TYPE(argv[0]) == T_STRING) {
return na_str_to_na(argc-1,argv+1,argv[0]);
}
if (argc > 1) {
rb_raise(rb_eArgError, "Only one array argument must be provided");
}
if (TYPE(argv[0]) == T_ARRAY) {
return na_ary_to_nary( argv[0], klass );
}
if (NA_IsNArray(argv[0])) {
return argv[0];
}
rb_raise(rb_eTypeError, "Argument must be Array or String (or NArray)");
return Qnil;
}
singleton method: NArray.to_na( string, type, size1,size2,…,sizeN ) NArray.to_na( array )
Public Instance Methods
Source
VALUE
na_clone(VALUE self)
{
struct NARRAY *org, *cpy;
GetNArray(self,org);
cpy = na_alloc_struct(org->type,org->rank,org->shape);
memcpy(cpy->ptr, org->ptr, na_sizeof[org->type] * org->total);
return na_wrap_struct(cpy,self);
}
method: dup()
Source
static VALUE na_coerce(VALUE self, VALUE other)
{
struct NARRAY *a1;
GetNArray(self,a1);
return rb_assoc_new( na_cast_object(other,a1->type), self );
}
method: coerce(other)
Source
static VALUE
na_collect(VALUE obj1)
{
int i, sz;
VALUE v, obj2;
struct NARRAY *a1, *a2;
char *p1, *p2;
void (*get)(), (*set)();
GetNArray(obj1,a1);
obj2 = na_make_object(a1->type, a1->rank, a1->shape, CLASS_OF(obj1));
GetNArray(obj2,a2);
p1 = a1->ptr;
p2 = a2->ptr;
sz = na_sizeof[a1->type];
get = SetFuncs[NA_ROBJ][a1->type];
set = SetFuncs[a1->type][NA_ROBJ];
for ( i=a1->total; i-->0; ) {
(*get)( 1, &v, 0, p1, 0 );
v = rb_yield(v);
(*set)( 1, p2, 0, &v, 0 );
p1 += sz;
p2 += sz;
}
return obj2;
}
iterator: collect()
Source
static VALUE
na_collect_bang(VALUE self)
{
int i, sz;
VALUE v;
struct NARRAY *a1;
char *p1;
void (*get)(), (*set)();
GetNArray(self,a1);
p1 = a1->ptr;
sz = na_sizeof[a1->type];
get = SetFuncs[NA_ROBJ][a1->type];
set = SetFuncs[a1->type][NA_ROBJ];
for ( i=a1->total; i-->0; ) {
(*get)( 1, &v, 0, p1, 0 );
v = rb_yield(v);
(*set)( 1, p1, 0, &v, 0 );
p1 += sz;
}
return self;
}
iterator: collect!()
Source
static VALUE
na_each(VALUE obj)
{
int i, sz;
VALUE v;
struct NARRAY *ary;
char *p;
void (*func)();
if (rb_block_given_p()) {
GetNArray(obj,ary);
p = ary->ptr;
sz = na_sizeof[ary->type];
func = SetFuncs[NA_ROBJ][ary->type];
for ( i=ary->total; i-->0; ) {
(*func)( 1, &v, 0, p, 0 );
rb_yield(v);
p += sz;
}
return Qnil;
} else {
return rb_funcall(obj, rb_intern("to_enum"), 0);
}
}
iterator: each()
Source
static VALUE
na_element_size(VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
return INT2FIX(na_sizeof[ary->type]);
}
method: element_size – returns the element size of the array type
Source
static VALUE
na_is_empty(VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
if (ary->total==0) return Qtrue;
return Qfalse;
}
method: empty? – returns true if empty array
Source
VALUE na_fill(VALUE self, volatile VALUE val)
{
struct NARRAY *a1, *a2;
GetNArray(self,a1);
val = na_cast_unless_narray(val,a1->type);
GetNArray(val,a2);
if (a2->total != 1)
rb_raise(rb_eArgError, "single-element argument required");
SetFuncs[a1->type][a2->type]( a1->total,
a1->ptr, na_sizeof[a1->type],
a2->ptr, 0 );
return self;
}
method: fill!(val)
Source
static VALUE
na_flatten_ref(VALUE self)
{
return na_flatten_bang( na_wrap_struct( na_ref_alloc_struct(self), self ));
}
method: flatten
Source
static VALUE
na_flatten_bang(VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
if (ary->total==0 || ary->rank==0)
rb_raise(rb_eRuntimeError, "cannot reshape empty array");
ary->shape[0] = ary->total;
ary->rank = 1;
return self;
}
method: flatten!
Source
VALUE
na_indgen(int argc, VALUE *argv, VALUE self)
{
int start=0, step=1;
struct NARRAY *ary;
if (argc>0) {
start = NUM2INT(argv[0]);
if (argc==2)
step = NUM2INT(argv[1]);
else
if (argc>2)
rb_raise(rb_eArgError, "wrong # of arguments (%d for <= 2)", argc);
}
GetNArray(self,ary);
IndGenFuncs[ary->type]( ary->total,
ary->ptr, na_sizeof[ary->type],
start, step );
return self;
}
method: indgen!([start,])
Source
static VALUE
na_inspect(VALUE self)
{
VALUE str;
struct NARRAY *ary;
int i;
char buf[256];
const char *classname;
const char *ref = "%s(ref).%s(%i";
const char *org = "%s.%s(%i";
GetNArray(self,ary);
classname = rb_class2name(CLASS_OF(self));
str = rb_str_new(0,0);
if (ary->rank < 1) {
sprintf(buf, "%s.%s(): []", classname, na_typestring[ary->type]);
rb_str_cat(str,buf,strlen(buf));
}
else {
sprintf(buf, (ary->ref==Qnil) ? org:ref,
classname, na_typestring[ary->type], ary->shape[0]);
rb_str_cat(str,buf,strlen(buf));
for (i=1; i<ary->rank; ++i) {
sprintf(buf,",%i",ary->shape[i]);
rb_str_cat(str,buf,strlen(buf));
}
rb_str_cat(str,")",1);
rb_str_cat(str,": \n",3);
rb_str_concat(str, na_make_inspect(self));
}
return str;
}
method: inspect() – returns the inspect of the array
Source
VALUE
na_newdim_ref(int argc, VALUE *argv, VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
ary = na_ref_alloc_struct(self);
na_newdim(argc, argv, ary);
return na_wrap_struct(ary,self);
}
method: newdim(size1,size2,…,sizeN)
Source
static VALUE
na_newdim_bang(int argc, VALUE *argv, VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
na_newdim(argc, argv, ary);
return self;
}
method: newdim!(size1,size2,…,sizeN)
Source
static VALUE
na_original(VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
return ary->ref;
}
method: self.original
Source
static VALUE
na_rank(VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
return INT2FIX(ary->rank);
}
method: rank() – returns the rank of the array
Source
static VALUE
na_refer(VALUE self)
{
return na_wrap_struct(na_ref_alloc_struct(self), self);
}
method: self.refer
Source
static VALUE
na_reshape_ref(int argc, VALUE *argv, VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
ary = na_ref_alloc_struct(self);
na_reshape(argc, argv, ary, self);
return na_wrap_struct(ary,self);
}
method: reshape(size1,size2,…,sizeN)
Source
static VALUE
na_reshape_bang(int argc, VALUE *argv, VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
na_reshape(argc, argv, ary, self);
return self;
}
method: reshape!(size1,size2,…,sizeN)
Source
static VALUE
na_shape(VALUE self)
{
struct NARRAY *ary;
VALUE *shape;
int i;
GetNArray(self,ary);
shape = ALLOCA_N(VALUE,ary->rank);
for (i = 0; i < ary->rank; ++i)
shape[i] = INT2FIX(ary->shape[i]);
return rb_ary_new4(ary->rank,shape);
}
method: shape() – returns an array of shape of each rank
Source
static VALUE
na_size(VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
return INT2FIX(ary->total);
}
method: size() – returns the total number of elements
Source
static VALUE
na_to_binary(VALUE self)
{
struct NARRAY *a1, *a2;
int i, *shape, rank;
VALUE v;
GetNArray(self,a1);
rank = a1->rank+1;
shape = ALLOCA_N(int,rank);
shape[0] = na_sizeof[a1->type];
for (i=1; i<rank; ++i)
shape[i] = a1->shape[i-1];
v = na_make_object( NA_BYTE, rank, shape, cNArray );
GetNArray(v,a2);
MEMCPY(a2->ptr,a1->ptr,char,a2->total);
return v;
}
Source
static VALUE
na_to_float(VALUE self)
{
struct NARRAY *a1, *a2;
VALUE v;
GetNArray(self,a1);
v = na_make_object(na_upcast[NA_SFLOAT][a1->type], a1->rank, a1->shape,
CLASS_OF(self));
GetNArray(v,a2);
na_copy_nary(a2,a1);
return v;
}
method: to_f()
Source
static VALUE
na_to_integer(VALUE self)
{
int type;
struct NARRAY *a1, *a2;
VALUE v;
GetNArray(self,a1);
if (!NA_IsINTEGER(a1))
type = NA_LINT;
else
type = a1->type;
v = na_make_object(type, a1->rank, a1->shape, CLASS_OF(self));
GetNArray(v,a2);
na_copy_nary(a2,a1);
return v;
}
method: to_i()
Source
static VALUE
na_to_s(VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
if (NA_IsROBJ(ary))
rb_raise(rb_eTypeError,"cannot convert object-type NArray");
return rb_str_new(ary->ptr,ary->total*na_sizeof[ary->type]);
}
method: to_s – convert the data contents to a binary string
Source
static VALUE
na_to_string(VALUE self)
{
VALUE v;
struct NARRAY *a1, *a2;
GetNArray(self,a1);
if (a1->total==0)
v = na_make_empty(NA_ROBJ, CLASS_OF(self));
else
if (a1->type==NA_BYTE) {
if (a1->rank==1)
return rb_str_new(a1->ptr,a1->shape[0]);
v = na_make_object(NA_ROBJ, a1->rank-1, a1->shape+1, cNArray);
GetNArray(v,a2);
na_to_string_binary( a2->total,
a2->ptr, sizeof(VALUE),
a1->ptr, a1->shape[0] );
} else {
v = na_make_object(NA_ROBJ, a1->rank, a1->shape, CLASS_OF(self));
GetNArray(v,a2);
ToStrFuncs[a1->type]( a2->total,
a2->ptr, sizeof(VALUE),
a1->ptr, na_sizeof[a1->type] );
}
return v;
}
method: to_string
Source
static VALUE
na_to_type(VALUE self, VALUE vtype)
{
struct NARRAY *a1, *a2;
VALUE v;
GetNArray(self,a1);
v = na_make_object(na_get_typecode(vtype), a1->rank, a1->shape,
CLASS_OF(self));
GetNArray(v,a2);
na_copy_nary(a2,a1);
return v;
}
method: to_type(type)
Source
static VALUE
na_to_type_as_binary(VALUE self, VALUE vtype)
{
struct NARRAY *a1, *a2;
int size, total, type;
VALUE v;
type = na_get_typecode(vtype);
GetNArray(self,a1);
size = a1->total * na_sizeof[a1->type];
if ( size % na_sizeof[type] != 0 )
rb_raise(rb_eRuntimeError, "bina1 size mismatch");
total = size / na_sizeof[type];
v = na_make_object( type, 1, &total, cNArray );
GetNArray(v,a2);
MEMCPY(a2->ptr,a1->ptr,char,size);
return v;
}
method: to_type_as_binary(type)
Source
static VALUE
na_typecode(VALUE self)
{
struct NARRAY *ary;
GetNArray(self,ary);
return INT2FIX(ary->type);
}
method: typecode – returns the type of the array
Source
static VALUE
na_where(VALUE self)
{
return RARRAY_PTR( na_where2(self) )[0];
}
method: where idx_true = narray.where
Source
static VALUE
na_where2(volatile VALUE obj)
{
VALUE v1, v0;
int n, i, n1, n0;
char *c;
int32_t *idx1, *idx0;
struct NARRAY *ary, *a1, *a0; /* a1=true, a0=false */
GetNArray(obj,ary);
/* Convert to NA_BYTE by calling "obj.ne(0)", if needed */
if(ary->type != NA_BYTE) {
obj = rb_funcall(obj, na_id_ne, 1, INT2FIX(0));
GetNArray(obj,ary);
}
n = ary->total;
/* Count true */
c = ary->ptr;
n1 = 0;
for (i=0; i<n; ++i)
if (*(c++)) ++n1;
n0 = n-n1;
/* partially true and false */
v1 = na_make_object( NA_LINT, 1, &n1, cNArray );
GetNArray(v1,a1);
idx1 = (int32_t*) a1->ptr;
v0 = na_make_object( NA_LINT, 1, &n0, cNArray );
GetNArray(v0,a0);
idx0 = (int32_t*) a0->ptr;
/* Get Indices */
c = ary->ptr;
for ( i=0; i<n; ++i ) {
if (*(c++))
*(idx1++) = i;
else
*(idx0++) = i;
}
return rb_assoc_new( v1, v0 );
}
method: where2 idx_true, idx_false = narray.where2