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
singleton method: NArray
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 ); }
class method: byte(size1,size2,…,sizeN)
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: 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: 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)
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)
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)
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)
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: new(type, size1,size2,…,sizeN)
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: 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); }
singleton method: NArray.refer
( other )
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 )
static VALUE na_s_refer(VALUE klass, VALUE self) { return na_wrap_struct_class(na_ref_alloc_struct(self), 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)
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)
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); }
singleton method: NArray.to_na
( string, type, size1,size2,…,sizeN ) NArray.to_na
( array )
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 )
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; }
Public Instance Methods
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); }
method: coerce(other)
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 ); }
iterator: collect()
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!()
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: each()
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); } }
method: element_size
– returns the element size of the array type
static VALUE na_element_size(VALUE self) { struct NARRAY *ary; GetNArray(self,ary); return INT2FIX(na_sizeof[ary->type]); }
method: empty? – returns true if empty array
static VALUE na_is_empty(VALUE self) { struct NARRAY *ary; GetNArray(self,ary); if (ary->total==0) return Qtrue; return Qfalse; }
method: fill!(val)
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: flatten
static VALUE na_flatten_ref(VALUE self) { return na_flatten_bang( na_wrap_struct( na_ref_alloc_struct(self), self )); }
method: flatten!
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: indgen!([start,])
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: inspect() – returns the inspect of the array
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: newdim(size1,size2,…,sizeN)
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)
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: self.original
static VALUE na_original(VALUE self) { struct NARRAY *ary; GetNArray(self,ary); return ary->ref; }
method: rank() – returns the rank of the array
static VALUE na_rank(VALUE self) { struct NARRAY *ary; GetNArray(self,ary); return INT2FIX(ary->rank); }
method: self.refer
static VALUE na_refer(VALUE self) { return na_wrap_struct(na_ref_alloc_struct(self), self); }
method: reshape(size1,size2,…,sizeN)
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)
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: shape() – returns an array of shape of each rank
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: size() – returns the total number of elements
static VALUE na_size(VALUE self) { struct NARRAY *ary; GetNArray(self,ary); return INT2FIX(ary->total); }
method: to_binary
– convert the data contents to a BYTE
type NArray
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; }
method: to_f
()
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_i
()
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_s
– convert the data contents to a binary string
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_string
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_type
(type)
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_as_binary
(type)
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: typecode – returns the type of the array
static VALUE na_typecode(VALUE self) { struct NARRAY *ary; GetNArray(self,ary); return INT2FIX(ary->type); }
method: where idx_true = narray.where
static VALUE na_where(VALUE self) { return RARRAY_PTR( na_where2(self) )[0]; }
method: where2 idx_true, idx_false = narray.where2
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 ); }