numo-narray 0.9.0.3 → 0.9.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +12 -6
- data/Rakefile +2 -10
- data/ext/numo/narray/array.c +1 -6
- data/ext/numo/narray/data.c +3 -9
- data/ext/numo/narray/depend.erb +1 -1
- data/ext/numo/narray/extconf.rb +0 -1
- data/ext/numo/narray/gen/def/bit.rb +2 -0
- data/ext/numo/narray/gen/def/dcomplex.rb +2 -0
- data/ext/numo/narray/gen/def/dfloat.rb +2 -0
- data/ext/numo/narray/gen/def/int16.rb +2 -0
- data/ext/numo/narray/gen/def/int32.rb +2 -0
- data/ext/numo/narray/gen/def/int64.rb +2 -0
- data/ext/numo/narray/gen/def/int8.rb +2 -0
- data/ext/numo/narray/gen/def/robject.rb +2 -0
- data/ext/numo/narray/gen/def/scomplex.rb +2 -0
- data/ext/numo/narray/gen/def/sfloat.rb +2 -0
- data/ext/numo/narray/gen/def/uint16.rb +2 -0
- data/ext/numo/narray/gen/def/uint32.rb +2 -0
- data/ext/numo/narray/gen/def/uint64.rb +2 -0
- data/ext/numo/narray/gen/def/uint8.rb +2 -0
- data/ext/numo/narray/gen/dtype.erb.c +7 -7
- data/ext/numo/narray/gen/spec.rb +24 -2
- data/ext/numo/narray/gen/tmpl/accum_binary.c +6 -0
- data/ext/numo/narray/gen/tmpl/aref.c +6 -4
- data/ext/numo/narray/gen/tmpl/aset.c +6 -4
- data/ext/numo/narray/gen/tmpl/binary.c +4 -0
- data/ext/numo/narray/gen/tmpl/binary2.c +4 -0
- data/ext/numo/narray/gen/tmpl/bincount.c +180 -0
- data/ext/numo/narray/gen/tmpl/cast.c +4 -0
- data/ext/numo/narray/gen/tmpl/cast_array.c +3 -64
- data/ext/numo/narray/gen/tmpl/cond_binary.c +4 -0
- data/ext/numo/narray/gen/tmpl/inspect.c +4 -0
- data/ext/numo/narray/gen/tmpl/pow.c +4 -0
- data/ext/numo/narray/gen/tmpl/qsort.c +1 -7
- data/ext/numo/narray/gen/tmpl/rand.c +13 -2
- data/ext/numo/narray/gen/tmpl/rand_norm.c +89 -16
- data/ext/numo/narray/gen/tmpl/store.c +4 -0
- data/ext/numo/narray/gen/tmpl/store_array.c +99 -2
- data/ext/numo/narray/gen/tmpl_bit/allocate.c +1 -1
- data/ext/numo/narray/gen/tmpl_bit/aref.c +6 -4
- data/ext/numo/narray/gen/tmpl_bit/aset.c +6 -4
- data/ext/numo/narray/gen/tmpl_bit/cast_array.c +3 -65
- data/ext/numo/narray/gen/tmpl_bit/mask.c +16 -1
- data/ext/numo/narray/gen/tmpl_bit/store_array.c +101 -2
- data/ext/numo/narray/gen/tmpl_bit/where.c +7 -23
- data/ext/numo/narray/gen/tmpl_bit/where2.c +58 -4
- data/ext/numo/narray/index.c +168 -166
- data/ext/numo/narray/kwarg.c +1 -6
- data/ext/numo/narray/math.c +8 -12
- data/ext/numo/narray/narray.c +231 -71
- data/ext/numo/narray/ndloop.c +86 -26
- data/ext/numo/narray/numo/intern.h +6 -10
- data/ext/numo/narray/numo/narray.h +83 -54
- data/ext/numo/narray/numo/ndloop.h +0 -5
- data/ext/numo/narray/numo/template.h +0 -5
- data/ext/numo/narray/numo/types/complex.h +1 -6
- data/ext/numo/narray/numo/types/complex_macro.h +30 -3
- data/ext/numo/narray/numo/types/dcomplex.h +18 -0
- data/ext/numo/narray/numo/types/dfloat.h +18 -0
- data/ext/numo/narray/numo/types/float_macro.h +25 -2
- data/ext/numo/narray/numo/types/robj_macro.h +2 -4
- data/ext/numo/narray/numo/types/scomplex.h +18 -0
- data/ext/numo/narray/numo/types/sfloat.h +18 -0
- data/ext/numo/narray/rand.c +0 -15
- data/ext/numo/narray/step.c +0 -5
- data/ext/numo/narray/struct.c +7 -12
- data/lib/erbpp/line_number.rb +4 -4
- data/lib/erbpp/narray_def.rb +16 -7
- data/lib/numo/narray.rb +2 -0
- data/lib/numo/narray/extra.rb +465 -0
- data/numo-narray.gemspec +2 -2
- data/spec/narray_spec.rb +4 -3
- metadata +13 -7
- data/ext/numo/narray/gen/tmpl/head.c +0 -25
@@ -11,7 +11,7 @@ if is_int && !is_object
|
|
11
11
|
rand_type = "uint#{rand_bit}_t"
|
12
12
|
%>
|
13
13
|
|
14
|
-
#define HWID (sizeof(dtype)
|
14
|
+
#define HWID (sizeof(dtype)*4)
|
15
15
|
|
16
16
|
static int msb_pos(<%=rand_type%> a)
|
17
17
|
{
|
@@ -109,7 +109,7 @@ static void
|
|
109
109
|
Generate uniformly distributed random numbers on self narray.
|
110
110
|
@overload rand([[low],high])
|
111
111
|
@param [Numeric] low lower inclusive boundary of random numbers. (default=0)
|
112
|
-
@param [Numeric] high upper exclusive boundary of random numbers. (default=1)
|
112
|
+
@param [Numeric] high upper exclusive boundary of random numbers. (default=1 or 1+1i for complex types)
|
113
113
|
@return [Numo::<%=class_name%>] self.
|
114
114
|
@example
|
115
115
|
Numo::DFloat.new(6).rand
|
@@ -131,14 +131,25 @@ static VALUE
|
|
131
131
|
ndfunc_arg_in_t ain[1] = {{OVERWRITE,0}};
|
132
132
|
ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 1,0, ain,0};
|
133
133
|
|
134
|
+
<% if is_int && !is_object %>
|
135
|
+
rb_scan_args(argc, args, "11", &v1, &v2);
|
136
|
+
if (v2==Qnil) {
|
137
|
+
g.low = m_zero;
|
138
|
+
g.max = high = m_num_to_data(v1);
|
139
|
+
<% else %>
|
134
140
|
rb_scan_args(argc, args, "02", &v1, &v2);
|
135
141
|
if (v2==Qnil) {
|
136
142
|
g.low = m_zero;
|
137
143
|
if (v1==Qnil) {
|
144
|
+
<% if is_complex %>
|
145
|
+
g.max = high = c_new(1,1);
|
146
|
+
<% else %>
|
138
147
|
g.max = high = m_one;
|
148
|
+
<% end %>
|
139
149
|
} else {
|
140
150
|
g.max = high = m_num_to_data(v1);
|
141
151
|
}
|
152
|
+
<% end %>
|
142
153
|
} else {
|
143
154
|
g.low = m_num_to_data(v1);
|
144
155
|
high = m_num_to_data(v2);
|
@@ -1,3 +1,8 @@
|
|
1
|
+
typedef struct {
|
2
|
+
dtype mu;
|
3
|
+
rtype sigma;
|
4
|
+
} randn_opt_t;
|
5
|
+
|
1
6
|
static void
|
2
7
|
<%=c_iter%>(na_loop_t *const lp)
|
3
8
|
{
|
@@ -5,42 +10,110 @@ static void
|
|
5
10
|
char *p1;
|
6
11
|
ssize_t s1;
|
7
12
|
size_t *idx1;
|
8
|
-
|
9
|
-
dtype
|
13
|
+
<% if is_complex %>
|
14
|
+
dtype *a0;
|
15
|
+
<% else %>
|
16
|
+
dtype *a0, *a1;
|
17
|
+
<% end %>
|
18
|
+
dtype mu;
|
19
|
+
rtype sigma;
|
20
|
+
randn_opt_t *g;
|
10
21
|
|
11
22
|
INIT_COUNTER(lp, i);
|
12
23
|
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
24
|
+
g = (randn_opt_t*)(lp->opt_ptr);
|
25
|
+
mu = g->mu;
|
26
|
+
sigma = g->sigma;
|
27
|
+
|
13
28
|
if (idx1) {
|
29
|
+
<% if is_complex %>
|
30
|
+
for (; i--;) {
|
31
|
+
a0 = (dtype*)(p1+*idx1);
|
32
|
+
m_rand_norm(mu,sigma,a0);
|
33
|
+
idx1 += 1;
|
34
|
+
}
|
35
|
+
<% else %>
|
14
36
|
for (; i>1; i-=2) {
|
15
|
-
|
16
|
-
|
17
|
-
|
37
|
+
a0 = (dtype*)(p1+*idx1);
|
38
|
+
a1 = (dtype*)(p1+*(idx1+1));
|
39
|
+
m_rand_norm(mu,sigma,a0,a1);
|
18
40
|
idx1 += 2;
|
19
41
|
}
|
20
42
|
if (i>0) {
|
21
|
-
|
22
|
-
|
43
|
+
a0 = (dtype*)(p1+*idx1);
|
44
|
+
m_rand_norm(mu,sigma,a0,0);
|
23
45
|
}
|
46
|
+
<% end %>
|
24
47
|
} else {
|
48
|
+
<% if is_complex %>
|
49
|
+
for (; i--;) {
|
50
|
+
a0 = (dtype*)(p1);
|
51
|
+
m_rand_norm(mu,sigma,a0);
|
52
|
+
p1 += s1;
|
53
|
+
}
|
54
|
+
<% else %>
|
25
55
|
for (; i>1; i-=2) {
|
26
|
-
|
27
|
-
|
28
|
-
|
56
|
+
a0 = (dtype*)(p1);
|
57
|
+
a1 = (dtype*)(p1+s1);
|
58
|
+
m_rand_norm(mu,sigma,a0,a1);
|
29
59
|
p1 += s1*2;
|
30
60
|
}
|
31
61
|
if (i>0) {
|
32
|
-
|
33
|
-
|
62
|
+
a0 = (dtype*)(p1);
|
63
|
+
m_rand_norm(mu,sigma,a0,0);
|
34
64
|
}
|
65
|
+
<% end %>
|
35
66
|
}
|
36
67
|
}
|
37
68
|
|
69
|
+
/*
|
70
|
+
Generates random numbers from the normal distribution on self narray
|
71
|
+
using Box-Muller Transformation.
|
72
|
+
@overload rand_norm([mu,[sigma]])
|
73
|
+
@param [Numeric] mu mean of normal distribution. (default=0)
|
74
|
+
@param [Numeric] sigma standard deviation of normal distribution. (default=1)
|
75
|
+
@return [Numo::<%=class_name%>] self.
|
76
|
+
@example
|
77
|
+
Numo::DFloat.new(5,5).rand_norm
|
78
|
+
=> Numo::DFloat#shape=[5,5]
|
79
|
+
[[-0.581255, -0.168354, 0.586895, -0.595142, -0.802802],
|
80
|
+
[-0.326106, 0.282922, 1.68427, 0.918499, -0.0485384],
|
81
|
+
[-0.464453, -0.992194, 0.413794, -0.60717, -0.699695],
|
82
|
+
[-1.64168, 0.48676, -0.875871, -1.43275, 0.812172],
|
83
|
+
[-0.209975, -0.103612, -0.878617, -1.42495, 1.0968]]
|
84
|
+
Numo::DFloat.new(5,5).rand_norm(10,0.1)
|
85
|
+
=> Numo::DFloat#shape=[5,5]
|
86
|
+
[[9.9019, 9.90339, 10.0826, 9.98384, 9.72861],
|
87
|
+
[9.81507, 10.0272, 9.91445, 10.0568, 9.88923],
|
88
|
+
[10.0234, 9.97874, 9.96011, 9.9006, 9.99964],
|
89
|
+
[10.0186, 9.94598, 9.92236, 9.99811, 9.97003],
|
90
|
+
[9.79266, 9.95044, 9.95212, 9.93692, 10.2027]]
|
91
|
+
Numo::DComplex.new(3,3).rand_norm(5+5i)
|
92
|
+
=> Numo::DComplex#shape=[3,3]
|
93
|
+
[[5.84303+4.40052i, 4.00984+6.08982i, 5.10979+5.13215i],
|
94
|
+
[4.26477+3.99655i, 4.90052+5.00763i, 4.46607+2.3444i],
|
95
|
+
[4.5528+7.11003i, 5.62117+6.69094i, 5.05443+5.35133i]]
|
96
|
+
*/
|
38
97
|
static VALUE
|
39
|
-
<%=c_func%>(VALUE self)
|
98
|
+
<%=c_func%>(int argc, VALUE *args, VALUE self)
|
40
99
|
{
|
100
|
+
int n;
|
101
|
+
randn_opt_t g;
|
102
|
+
VALUE v1=Qnil, v2=Qnil;
|
41
103
|
ndfunc_arg_in_t ain[1] = {{OVERWRITE,0}};
|
42
|
-
ndfunc_t ndf = {
|
104
|
+
ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 1,0, ain,0};
|
43
105
|
|
44
|
-
|
45
|
-
|
106
|
+
n = rb_scan_args(argc, args, "02", &v1, &v2);
|
107
|
+
if (n == 0) {
|
108
|
+
g.mu = m_zero;
|
109
|
+
} else {
|
110
|
+
g.mu = m_num_to_data(v1);
|
111
|
+
}
|
112
|
+
if (n == 2) {
|
113
|
+
g.sigma = NUM2DBL(v2);
|
114
|
+
} else {
|
115
|
+
g.sigma = 1;
|
116
|
+
}
|
117
|
+
na_ndloop3(&ndf, &g, 1, self);
|
118
|
+
return self;
|
46
119
|
}
|
@@ -24,8 +24,12 @@ static VALUE
|
|
24
24
|
}
|
25
25
|
}
|
26
26
|
|
27
|
+
<% if is_object %>
|
28
|
+
numo_robject_store_numeric(self,obj);
|
29
|
+
<% else %>
|
27
30
|
rb_raise(nary_eCastError, "unknown conversion from %s to %s",
|
28
31
|
rb_class2name(CLASS_OF(obj)),
|
29
32
|
rb_class2name(CLASS_OF(self)));
|
33
|
+
<% end %>
|
30
34
|
return self;
|
31
35
|
}
|
@@ -1,5 +1,102 @@
|
|
1
|
+
static void
|
2
|
+
<%=c_iter%>(na_loop_t *const lp)
|
3
|
+
{
|
4
|
+
size_t i, n;
|
5
|
+
size_t i1, n1;
|
6
|
+
VALUE v1, *ptr;
|
7
|
+
char *p1;
|
8
|
+
size_t s1, *idx1;
|
9
|
+
VALUE x;
|
10
|
+
double y;
|
11
|
+
dtype z;
|
12
|
+
size_t len, c;
|
13
|
+
double beg, step;
|
14
|
+
|
15
|
+
INIT_COUNTER(lp, n);
|
16
|
+
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
17
|
+
v1 = lp->args[1].value;
|
18
|
+
i = 0;
|
19
|
+
|
20
|
+
if (lp->args[1].ptr) {
|
21
|
+
if (v1 == Qtrue) {
|
22
|
+
iter_<%=tp%>_store_<%=tp%>(lp);
|
23
|
+
i = lp->args[1].shape[0];
|
24
|
+
if (idx1) {
|
25
|
+
idx1 += i;
|
26
|
+
} else {
|
27
|
+
p1 += s1 * i;
|
28
|
+
}
|
29
|
+
}
|
30
|
+
goto loop_end;
|
31
|
+
}
|
32
|
+
|
33
|
+
ptr = &v1;
|
34
|
+
|
35
|
+
switch(TYPE(v1)) {
|
36
|
+
case T_ARRAY:
|
37
|
+
n1 = RARRAY_LEN(v1);
|
38
|
+
ptr = RARRAY_PTR(v1);
|
39
|
+
break;
|
40
|
+
case T_NIL:
|
41
|
+
n1 = 0;
|
42
|
+
break;
|
43
|
+
default:
|
44
|
+
n1 = 1;
|
45
|
+
}
|
46
|
+
|
47
|
+
if (idx1) {
|
48
|
+
for (i=i1=0; i1<n1 && i<n; i++,i1++) {
|
49
|
+
x = ptr[i1];
|
50
|
+
if (rb_obj_is_kind_of(x, rb_cRange) || rb_obj_is_kind_of(x, na_cStep)) {
|
51
|
+
nary_step_sequence(x,&len,&beg,&step);
|
52
|
+
for (c=0; c<len && i<n; c++,i++) {
|
53
|
+
y = beg + step * c;
|
54
|
+
z = m_from_double(y);
|
55
|
+
SET_DATA_INDEX(p1, idx1, dtype, z);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
else if (TYPE(x) != T_ARRAY) {
|
59
|
+
z = m_num_to_data(x);
|
60
|
+
SET_DATA_INDEX(p1, idx1, dtype, z);
|
61
|
+
}
|
62
|
+
}
|
63
|
+
} else {
|
64
|
+
for (i=i1=0; i1<n1 && i<n; i++,i1++) {
|
65
|
+
x = ptr[i1];
|
66
|
+
if (rb_obj_is_kind_of(x, rb_cRange) || rb_obj_is_kind_of(x, na_cStep)) {
|
67
|
+
nary_step_sequence(x,&len,&beg,&step);
|
68
|
+
for (c=0; c<len && i<n; c++,i++) {
|
69
|
+
y = beg + step * c;
|
70
|
+
z = m_from_double(y);
|
71
|
+
SET_DATA_STRIDE(p1, s1, dtype, z);
|
72
|
+
}
|
73
|
+
}
|
74
|
+
else if (TYPE(x) != T_ARRAY) {
|
75
|
+
z = m_num_to_data(x);
|
76
|
+
SET_DATA_STRIDE(p1, s1, dtype, z);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
loop_end:
|
82
|
+
z = m_zero;
|
83
|
+
if (idx1) {
|
84
|
+
for (; i<n; i++) {
|
85
|
+
SET_DATA_INDEX(p1, idx1, dtype, z);
|
86
|
+
}
|
87
|
+
} else {
|
88
|
+
for (; i<n; i++) {
|
89
|
+
SET_DATA_STRIDE(p1, s1, dtype, z);
|
90
|
+
}
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
1
94
|
static VALUE
|
2
|
-
<%=c_func%>(VALUE self, VALUE
|
95
|
+
<%=c_func%>(VALUE self, VALUE rary)
|
3
96
|
{
|
4
|
-
|
97
|
+
ndfunc_arg_in_t ain[2] = {{OVERWRITE,0},{rb_cArray,0}};
|
98
|
+
ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 2, 0, ain, 0};
|
99
|
+
|
100
|
+
na_ndloop_store_rarray(&ndf, self, rary);
|
101
|
+
return self;
|
5
102
|
}
|
@@ -10,7 +10,7 @@ static VALUE
|
|
10
10
|
case NARRAY_DATA_T:
|
11
11
|
ptr = NA_DATA_PTR(na);
|
12
12
|
if (na->size > 0 && ptr == NULL) {
|
13
|
-
ptr = xmalloc(((na->size-1)/sizeof(BIT_DIGIT)+1)*sizeof(BIT_DIGIT)
|
13
|
+
ptr = xmalloc(((na->size-1)/8/sizeof(BIT_DIGIT)+1)*sizeof(BIT_DIGIT));
|
14
14
|
NA_DATA_PTR(na) = ptr;
|
15
15
|
}
|
16
16
|
break;
|
@@ -9,6 +9,7 @@
|
|
9
9
|
+dim0+, +dim1+, ... includes other than Numeric index, e.g., Range
|
10
10
|
or Array or true.
|
11
11
|
|
12
|
+
@example
|
12
13
|
a = Numo::DFloat.new(4,5).seq
|
13
14
|
=> Numo::DFloat#shape=[4,5]
|
14
15
|
[[0, 1, 2, 3, 4],
|
@@ -38,13 +39,14 @@
|
|
38
39
|
static VALUE
|
39
40
|
<%=c_func%>(int argc, VALUE *argv, VALUE self)
|
40
41
|
{
|
41
|
-
|
42
|
+
int nd;
|
43
|
+
size_t pos;
|
42
44
|
char *ptr;
|
43
45
|
dtype x;
|
44
46
|
|
45
|
-
|
46
|
-
if (
|
47
|
-
return na_aref_main(argc, argv, self, 0);
|
47
|
+
nd = na_get_result_dimension(self, argc, argv, 1, &pos);
|
48
|
+
if (nd) {
|
49
|
+
return na_aref_main(argc, argv, self, 0, nd);
|
48
50
|
} else {
|
49
51
|
ptr = na_get_pointer_for_read(self);
|
50
52
|
LOAD_BIT(ptr,pos,x);
|
@@ -8,6 +8,7 @@
|
|
8
8
|
--- Replace element(s) at +dim0+, +dim1+, ... (index/range/array/true
|
9
9
|
for each dimention). Broadcasting mechanism is applied.
|
10
10
|
|
11
|
+
@example
|
11
12
|
a = Numo::DFloat.new(3,4).seq
|
12
13
|
=> Numo::DFloat#shape=[3,4]
|
13
14
|
[[0, 1, 2, 3],
|
@@ -39,7 +40,8 @@
|
|
39
40
|
static VALUE
|
40
41
|
<%=c_func%>(int argc, VALUE *argv, VALUE self)
|
41
42
|
{
|
42
|
-
|
43
|
+
int nd;
|
44
|
+
size_t pos;
|
43
45
|
char *ptr;
|
44
46
|
VALUE a;
|
45
47
|
dtype x;
|
@@ -48,9 +50,9 @@ static VALUE
|
|
48
50
|
if (argc==0) {
|
49
51
|
<%=c_func.sub(/_aset/,"_store")%>(self, argv[argc]);
|
50
52
|
} else {
|
51
|
-
|
52
|
-
if (
|
53
|
-
a = na_aref_main(argc, argv, self, 0);
|
53
|
+
nd = na_get_result_dimension(self, argc, argv, 1, &pos);
|
54
|
+
if (nd) {
|
55
|
+
a = na_aref_main(argc, argv, self, 0, nd);
|
54
56
|
<%=c_func.sub(/_aset/,"_store")%>(a, argv[argc]);
|
55
57
|
} else {
|
56
58
|
ptr = na_get_pointer_for_read_write(self);
|
@@ -1,80 +1,18 @@
|
|
1
|
-
static void
|
2
|
-
<%=c_iter%>(na_loop_t *const lp)
|
3
|
-
{
|
4
|
-
size_t i, n;
|
5
|
-
size_t i1, n1;
|
6
|
-
VALUE v1, *ptr;
|
7
|
-
BIT_DIGIT *a2;
|
8
|
-
size_t p2;
|
9
|
-
size_t s2, *idx2;
|
10
|
-
VALUE x;
|
11
|
-
double y;
|
12
|
-
BIT_DIGIT z;
|
13
|
-
size_t len, c;
|
14
|
-
double beg, step;
|
15
|
-
|
16
|
-
v1 = lp->args[0].value;
|
17
|
-
ptr = &v1;
|
18
|
-
INIT_COUNTER(lp, n);
|
19
|
-
INIT_PTR_BIT_IDX(lp, 1, a2, p2, s2, idx2);
|
20
|
-
|
21
|
-
switch(TYPE(v1)) {
|
22
|
-
case T_ARRAY:
|
23
|
-
n1 = RARRAY_LEN(v1);
|
24
|
-
ptr = RARRAY_PTR(v1);
|
25
|
-
break;
|
26
|
-
case T_NIL:
|
27
|
-
n1 = 0;
|
28
|
-
break;
|
29
|
-
default:
|
30
|
-
n1 = 1;
|
31
|
-
}
|
32
|
-
if (idx2) {
|
33
|
-
<% ["STORE_BIT(a2, p2+*idx2, z); idx2++;",
|
34
|
-
"STORE_BIT(a2, p2, z); p2+=s2;"].each_with_index do |x,i| %>
|
35
|
-
for (i=i1=0; i1<n1 && i<n; i++,i1++) {
|
36
|
-
x = ptr[i1];
|
37
|
-
if (rb_obj_is_kind_of(x, rb_cRange) || rb_obj_is_kind_of(x, na_cStep)) {
|
38
|
-
nary_step_sequence(x,&len,&beg,&step);
|
39
|
-
for (c=0; c<len && i<n; c++,i++) {
|
40
|
-
y = beg + step * c;
|
41
|
-
z = m_from_double(y);
|
42
|
-
<%= x %>
|
43
|
-
}
|
44
|
-
}
|
45
|
-
if (TYPE(x) != T_ARRAY) {
|
46
|
-
if (x == Qnil) x = INT2FIX(0);
|
47
|
-
z = m_num_to_data(x);
|
48
|
-
<%= x %>
|
49
|
-
}
|
50
|
-
}
|
51
|
-
z = m_zero;
|
52
|
-
for (; i<n; i++) {
|
53
|
-
<%= x %>
|
54
|
-
}
|
55
|
-
<% if i<1 %>
|
56
|
-
} else {
|
57
|
-
<% end
|
58
|
-
end %>
|
59
|
-
}
|
60
|
-
}
|
61
|
-
|
62
1
|
static VALUE
|
63
2
|
<%=c_func%>(VALUE rary)
|
64
3
|
{
|
65
|
-
|
4
|
+
VALUE vnc, nary;
|
66
5
|
narray_t *na;
|
67
6
|
na_compose_t *nc;
|
68
|
-
ndfunc_arg_in_t ain[2] = {{rb_cArray,0},{Qnil,0}};
|
69
|
-
ndfunc_t ndf = {<%=c_iter%>, FULL_LOOP, 2,0, ain,0};
|
70
7
|
|
71
8
|
vnc = na_ary_composition(rary);
|
72
9
|
Data_Get_Struct(vnc, na_compose_t, nc);
|
73
10
|
nary = rb_narray_new(cT, nc->ndim, nc->shape);
|
11
|
+
RB_GC_GUARD(vnc);
|
74
12
|
GetNArray(nary,na);
|
75
13
|
if (na->size > 0) {
|
76
14
|
<%=find_tmpl("allocate").c_func%>(nary);
|
77
|
-
|
15
|
+
<%=find_tmpl("store_array").c_func%>(nary, rary);
|
78
16
|
}
|
79
17
|
return nary;
|
80
18
|
}
|