ext/kmat/smat/constructer.c in kmat-0.0.3 vs ext/kmat/smat/constructer.c in kmat-0.1.0

- old
+ new

@@ -10,13 +10,13 @@ static VALUE km_Mat_uninitialized(int argc, VALUE *argv) { rb_check_arity(argc, 0, 2); if ( argc == 2 ) { - return km_Mat(NUM2INT(argv[0]), NUM2INT(argv[1]), VT_DOUBLE); + return km_Mat(NUM2ZU(argv[0]), NUM2ZU(argv[1]), VT_DOUBLE); } else if ( argc == 1 ) { - return km_Mat(NUM2INT(argv[0]), 1, VT_DOUBLE); + return km_Mat(NUM2ZU(argv[0]), 1, VT_DOUBLE); } else { return km_Mat(0, 0, VT_DOUBLE); } } @@ -47,17 +47,17 @@ VALUE kmm_Mat_fill(int argc, VALUE *argv, VALUE self) { rb_check_arity(argc, 1, 3); VTYPE vt; VALUE ret; - VALUE v = argv[argc-1]; - int type = TYPE(v); + const VALUE v = argv[argc-1]; + const int type = TYPE(v); if ( type == T_FLOAT ) { vt = VT_DOUBLE; } else if ( type == T_COMPLEX ) { - VALUE x = rb_funcall(v, id_real, 0); - VALUE y = rb_funcall(v, id_imag, 0); + const VALUE x = rb_funcall(v, id_real, 0); + const VALUE y = rb_funcall(v, id_imag, 0); if ( ( TYPE(x) == T_FLOAT || TYPE(x) == T_FIXNUM ) && ( TYPE(y) == T_FLOAT || TYPE(y) == T_FIXNUM ) ) { vt = VT_COMPLEX; } else { vt = VT_VALUE; } @@ -67,13 +67,13 @@ vt = VT_BOOL; } else { vt = VT_VALUE; } if ( argc == 3 ) { - ret = km_Mat(NUM2INT(argv[0]), NUM2INT(argv[1]), vt); + ret = km_Mat(NUM2ZU(argv[0]), NUM2ZU(argv[1]), vt); } else if ( argc == 2 ) { - ret = km_Mat(NUM2INT(argv[0]), 1, vt); + ret = km_Mat(NUM2ZU(argv[0]), 1, vt); } else { ret = km_Mat(1, 1, vt); } return kmm_mat_fill(ret, v); } @@ -82,26 +82,26 @@ VALUE kmm_Mat_eye(int argc, VALUE *argv, VALUE self) { VALUE ret = kmm_Mat_zeros(argc, argv, self); SMAT *smat = km_mat2smat(ret); - const int n = MIN(smat->m, smat->n); - for ( int i=0; i<n; i++ ) { + const size_t n = MIN(smat->m, smat->n); + for ( size_t i=0; i<n; i++ ) { smat->dbody[i+i*(smat->ld)] = 1.0; } return ret; } // almost the same as Mat.eye but Mat.identity returns only square matrix // alias I VALUE kmm_Mat_identity(VALUE self, VALUE vn) { - const int n = NUM2INT(vn); + const size_t n = NUM2ZU(vn); VALUE ret = km_Mat(n, n, VT_DOUBLE); SMAT *smat = km_mat2smat(ret); - for ( int i=0; i<n; i++ ) { + for ( size_t i=0; i<n; i++ ) { smat->dbody[i+i*n] = 1.0; } return ret; } @@ -121,173 +121,173 @@ if ( src->vtype != VT_DOUBLE ) { vsrc = kmm_mat_to_fmat(argv[0]); src = km_mat2smat(vsrc); } if ( VECTOR_P(src) ) { // the argument is a vector - const int len = LENGTH(src); + const size_t len = LENGTH(src); ret = km_Mat(len, len, VT_DOUBLE); SMAT *dest = km_mat2smat(ret); if ( src->stype == ST_RSUB ) { - for ( int i=0; i<len; i++ ) { + for ( size_t i=0; i<len; i++ ) { dest->dbody[i+i*len] = *((src->dpbody)[i]); } } else { - for ( int i=0; i<len; i++ ) { + for ( size_t i=0; i<len; i++ ) { dest->dbody[i+i*len] = src->dbody[i]; } } } else { // the argument is a matrix ret = km_Mat(src->m, src->n, VT_DOUBLE); SMAT *dest = km_mat2smat(ret); - const int n = MIN(src->m, src->n); + const size_t n = MIN(src->m, src->n); if ( src->stype == ST_RSUB ) { - for ( int i=0; i<n; i++ ) { + for ( size_t i=0; i<n; i++ ) { dest->dbody[i+i*(dest->ld)] = *((src->dpbody)[i+i*(src->ld)]); } } else { - for ( int i=0; i<n; i++ ) { + for ( size_t i=0; i<n; i++ ) { dest->dbody[i+i*(dest->ld)] = src->dbody[i+i*(src->ld)]; } } } return ret; } else if ( TYPE(vsrc) == T_ARRAY ) { // the argument is an Array const long len = RARRAY_LEN(argv[0]); - VALUE ret = km_Mat((int)len, (int)len, VT_DOUBLE); + VALUE ret = km_Mat((size_t)len, (size_t)len, VT_DOUBLE); double *body = km_mat2smat(ret)->dbody; for ( long i=0; i<len; i++ ) { - body[i+i*len] = NUM2DBL(rb_ary_entry(vsrc, i)); + body[l2s(i+i*len)] = NUM2DBL(rb_ary_entry(vsrc, i)); } return ret; } else { // (1, 1)-matrix. the (0, 0)-th element is the argument VALUE ret = km_Mat(1, 1, VT_DOUBLE); km_mat2smat(ret)->dbody[0] = NUM2DBL(vsrc); return ret; } } else { // k is given - int k = NUM2INT(argv[1]); + const long k = NUM2LONG(argv[1]); if ( rb_obj_is_kind_of(vsrc, km_cMat) ) { VALUE ret; SMAT *src = km_mat2smat(vsrc); if ( src->vtype != VT_DOUBLE ) { vsrc = kmm_mat_to_fmat(argv[0]); src = km_mat2smat(vsrc); } if ( VECTOR_P(src) ) { // the argument is a vector - const int len_s = LENGTH(src); - const int len = len_s + ABS(k); + const size_t len_s = LENGTH(src); + const size_t len = len_s + l2s(ABS(k)); ret = km_Mat(len, len, VT_DOUBLE); SMAT *dest = km_mat2smat(ret); if ( 0 < k ) { if ( src->stype == ST_RSUB ) { - for ( int i=0; i<len_s; i++ ) { - dest->dbody[i+(i+k)*len] = *((src->dpbody)[i]); + for ( size_t i=0; i<len_s; i++ ) { + dest->dbody[i+(i+l2s(k))*len] = *((src->dpbody)[i]); } } else { - for ( int i=0; i<len_s; i++ ) { - dest->dbody[i+(i+k)*len] = src->dbody[i]; + for ( size_t i=0; i<len_s; i++ ) { + dest->dbody[i+(i+l2s(k))*len] = src->dbody[i]; } } } else { if ( src->stype == ST_RSUB ) { - for ( int i=0; i<len_s; i++ ) { - dest->dbody[(i-k)+i*len] = *((src->dpbody)[i]); + for ( size_t i=0; i<len_s; i++ ) { + dest->dbody[(i+l2s(-k))+i*len] = *((src->dpbody)[i]); } } else { - for ( int i=0; i<len_s; i++ ) { - dest->dbody[(i-k)+i*len] = src->dbody[i]; + for ( size_t i=0; i<len_s; i++ ) { + dest->dbody[(i+l2s(-k))+i*len] = src->dbody[i]; } } } } else { // the argument is a matrix ret = km_Mat(src->m, src->n, VT_DOUBLE); SMAT *dest = km_mat2smat(ret); - int len, i_s, j_s; + size_t len, i_s, j_s; if ( 0 < k ) { - if ( k < (src->n)-(src->m) ) { + if ( k < s2l(src->n)-s2l(src->m) ) { len = src->m; } else { - len = src->n-k; + len = src->n+l2s(-k); } - i_s = 0; j_s = k; + i_s = 0; j_s = l2s(k); } else { - if ( k < (src->n)-(src->m) ) { - len = src->m+k; + if ( k < s2l(src->n)-s2l(src->m) ) { + len = src->m+l2s(k); } else { len = src->n; } - i_s = -k; j_s = 0; + i_s = l2s(-k); j_s = 0; } - for ( int i=0; i<len; i++ ) { + for ( size_t i=0; i<len; i++ ) { dest->dbody[i_s+i+(j_s+i)*(dest->ld)] = ENTITY(src, d, i_s+i, j_s+i); } } return ret; } else if ( TYPE(vsrc) == T_ARRAY ) { // the argument is an Array const long len_s = RARRAY_LEN(argv[0]); - int len = ((int)len_s)+ABS(k); + const size_t len = l2s(len_s+ABS(k)); VALUE ret = km_Mat(len, len, VT_DOUBLE); double *body = km_mat2smat(ret)->dbody; if ( 0 < k ) { for ( long i=0; i<len_s; i++ ) { - body[i+(i+k)*len] = NUM2DBL(rb_ary_entry(vsrc, i)); + body[l2s(i)+l2s(i+k)*len] = NUM2DBL(rb_ary_entry(vsrc, i)); } } else { for ( long i=0; i<len_s; i++ ) { - body[i-k+i*len] = NUM2DBL(rb_ary_entry(vsrc, i)); + body[l2s(i-k)+l2s(i)*len] = NUM2DBL(rb_ary_entry(vsrc, i)); } } return ret; } else { // (1+abs(k), 1+abs(k))-matrix. the (0, k)-th element (0<k) or (-k, 0)-th element (k<0) is the argument - const int len = 1+ABS(k); + const size_t len = l2s(1+ABS(k)); VALUE ret = km_Mat(len, len, VT_DOUBLE); if ( 0 < k ) { - km_mat2smat(ret)->dbody[k*len] = NUM2DBL(vsrc); + km_mat2smat(ret)->dbody[l2s(k)*len] = NUM2DBL(vsrc); } else { - km_mat2smat(ret)->dbody[-k] = NUM2DBL(vsrc); + km_mat2smat(ret)->dbody[l2s(-k)] = NUM2DBL(vsrc); } return ret; } } } // make a vector which contains 0..(vn-1) VALUE kmm_Mat_range(VALUE self, VALUE vn) { - const int n = NUM2INT(vn); + const size_t n = NUM2ZU(vn); VALUE ret = km_Mat(n, 1, VT_DOUBLE); double *body = km_mat2smat(ret)->dbody; - for ( int i=0; i<n; i++ ) { + for ( size_t i=0; i<n; i++ ) { body[i] = (double)i; } return ret; } VALUE kmm_Mat_irange(VALUE self, VALUE vn) { - const int n = NUM2INT(vn); + const size_t n = NUM2ZU(vn); VALUE ret = km_Mat(n, 1, VT_INT); int *body = km_mat2smat(ret)->ibody; - for ( int i=0; i<n; i++ ) { - body[i] = i; + for ( size_t i=0; i<n; i++ ) { + body[i] = s2i(i); } return ret; } // make a matrix which elements follows U(0, 1) VALUE kmm_Mat__rand0(VALUE self, VALUE vm, VALUE vn, VALUE random) { - VALUE ret = km_Mat(NUM2INT(vm), NUM2INT(vn), VT_DOUBLE); + VALUE ret = km_Mat(NUM2ZU(vm), NUM2ZU(vn), VT_DOUBLE); return kmm_mat__rand0(ret, random, Qnil); } // make a matrix which elements follows N(0, 1) VALUE kmm_Mat__randn0(VALUE self, VALUE vm, VALUE vn, VALUE random) { - VALUE ret = km_Mat(NUM2INT(vm), NUM2INT(vn), VT_DOUBLE); + VALUE ret = km_Mat(NUM2ZU(vm), NUM2ZU(vn), VT_DOUBLE); return kmm_mat__randn0(ret, random); } // make a complex matrix. the real parts are `vr' and the imaginary parts are `vi' VALUE