narray 0.5.9.4 → 0.5.9.5
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.
- data/src/ChangeLog +29 -0
- data/src/MANIFEST +7 -36
- data/src/README.en +1 -5
- data/src/README.ja +1 -2
- data/src/SPEC.en +15 -8
- data/src/SPEC.ja +5 -2
- data/src/bench/all.rb +88 -0
- data/src/bench/bench.m +61 -0
- data/src/bench/bench.py +89 -0
- data/src/bench/bench.rb +59 -0
- data/src/bench/dummy.m +0 -0
- data/src/bench/dummy.py +13 -0
- data/src/bench/dummy.rb +0 -0
- data/src/lib/narray_ext.rb +36 -2
- data/src/mkmath.rb +4 -4
- data/src/mkop.rb +16 -16
- data/src/na_array.c +32 -32
- data/src/na_func.c +50 -50
- data/src/na_index.c +26 -32
- data/src/na_linalg.c +23 -26
- data/src/na_random.c +15 -18
- data/src/narray.c +22 -32
- data/src/narray.h +3 -3
- data/src/narray_local.h +1 -1
- metadata +10 -39
- data/src/nimage/README.en +0 -38
- data/src/nimage/demo/fits.rb +0 -97
- data/src/nimage/demo/fits_convol.rb +0 -28
- data/src/nimage/demo/fits_fftdemo.rb +0 -27
- data/src/nimage/demo/fitsdemo1.rb +0 -13
- data/src/nimage/demo/fitsdemo2.rb +0 -30
- data/src/nimage/demo/fitsdemo3.rb +0 -26
- data/src/nimage/demo/fitsmorph.rb +0 -39
- data/src/nimage/demo/life_na.rb +0 -57
- data/src/nimage/demo/mandel.rb +0 -41
- data/src/nimage/extconf.rb +0 -12
- data/src/nimage/lib/nimage.rb +0 -51
- data/src/nimage/nimage.c +0 -328
- data/src/speed/add.py +0 -12
- data/src/speed/add.rb +0 -8
- data/src/speed/add_int.py +0 -12
- data/src/speed/add_int.rb +0 -9
- data/src/speed/lu.m +0 -14
- data/src/speed/lu.rb +0 -22
- data/src/speed/mat.m +0 -23
- data/src/speed/mat.rb +0 -28
- data/src/speed/mul.py +0 -12
- data/src/speed/mul.rb +0 -9
- data/src/speed/mul2.py +0 -15
- data/src/speed/mul2.rb +0 -13
- data/src/speed/mul_comp.py +0 -12
- data/src/speed/mul_comp.rb +0 -9
- data/src/speed/mul_int.py +0 -12
- data/src/speed/mul_int.rb +0 -9
- data/src/speed/mybench.py +0 -15
- data/src/speed/mybench.rb +0 -31
- data/src/speed/solve.m +0 -18
- data/src/speed/solve.py +0 -16
- data/src/speed/solve.rb +0 -21
data/src/na_func.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
na_func.c
|
3
3
|
Numerical Array Extention for Ruby
|
4
|
-
(C) Copyright 1999-
|
4
|
+
(C) Copyright 1999-2008 by Masahiro TANAKA
|
5
5
|
|
6
6
|
This program is free software.
|
7
7
|
You can distribute/modify this program
|
@@ -32,7 +32,7 @@ void
|
|
32
32
|
{
|
33
33
|
int i;
|
34
34
|
|
35
|
-
for (i=0; i<ndim; i
|
35
|
+
for (i=0; i<ndim; ++i) {
|
36
36
|
max_shp[i] = na_max3(shp1[i], shp2[i], shp3[i]);
|
37
37
|
}
|
38
38
|
}
|
@@ -51,10 +51,10 @@ void na_init_slice( struct slice *s, int rank, int *shape, int elmsz )
|
|
51
51
|
|
52
52
|
/* set strides and clear index */
|
53
53
|
s[0].stride = 1;
|
54
|
-
for (r=1; r<rank; r
|
54
|
+
for (r=1; r<rank; ++r)
|
55
55
|
s[r].stride = s[r-1].stride * shape[r-1];
|
56
56
|
|
57
|
-
for (r=0; r<rank; r
|
57
|
+
for (r=0; r<rank; ++r) {
|
58
58
|
if ( s[r].idx == NULL )
|
59
59
|
/* regular interval */
|
60
60
|
s[r].pstep = s[r].step * s[r].stride * elmsz;
|
@@ -62,7 +62,7 @@ void na_init_slice( struct slice *s, int rank, int *shape, int elmsz )
|
|
62
62
|
/* index */
|
63
63
|
s[r].pstep = b = s[r].stride * elmsz;
|
64
64
|
/* convert index to byte-unit */
|
65
|
-
for (i=0; i<16; i
|
65
|
+
for (i=0; i<16; ++i)
|
66
66
|
if ( (1<<i) == b ) { b=i; break; }
|
67
67
|
if (i==16)
|
68
68
|
for (idx=s[r].idx,i=s[r].n; i-->0; ) { *(idx++)*=b; }
|
@@ -75,7 +75,7 @@ void na_init_slice( struct slice *s, int rank, int *shape, int elmsz )
|
|
75
75
|
s[rank].n = 0;
|
76
76
|
s[rank].idx = NULL;
|
77
77
|
|
78
|
-
for (r=rank-1;r>=0
|
78
|
+
for (r=rank-1;r>=0;--r) {
|
79
79
|
/* set beginning pointers */
|
80
80
|
if ( s[r].idx == NULL )
|
81
81
|
s[r].pbeg = s[r].stride * s[r].beg * elmsz;
|
@@ -102,7 +102,7 @@ static void
|
|
102
102
|
for(;;) {
|
103
103
|
/* set pointers */
|
104
104
|
while (i > 0) {
|
105
|
-
i
|
105
|
+
--i;
|
106
106
|
s2[i].p = s2[i].pbeg + s2[i+1].p;
|
107
107
|
s1[i].p = s1[i].pbeg + s1[i+1].p;
|
108
108
|
si[i] = s1[i].n;
|
@@ -139,7 +139,7 @@ static void
|
|
139
139
|
for(;;) {
|
140
140
|
/* set pointers */
|
141
141
|
while (i > 0) {
|
142
|
-
i
|
142
|
+
--i;
|
143
143
|
s3[i].p = s3[i].pbeg + s3[i+1].p;
|
144
144
|
s2[i].p = s2[i].pbeg + s2[i+1].p;
|
145
145
|
s1[i].p = s1[i].pbeg + s1[i+1].p;
|
@@ -187,7 +187,7 @@ void na_loop_index_ref( struct NARRAY *a1, struct NARRAY *a2,
|
|
187
187
|
for(;;) {
|
188
188
|
/* set pointers */
|
189
189
|
while (i > 0) {
|
190
|
-
i
|
190
|
+
--i;
|
191
191
|
s2[i].p = s2[i].pbeg + s2[i+1].p;
|
192
192
|
s1[i].p = s1[i].pbeg + s1[i+1].p;
|
193
193
|
si[i] = 0;
|
@@ -245,7 +245,7 @@ void na_loop_general( struct NARRAY *a1, struct NARRAY *a2,
|
|
245
245
|
for(;;) {
|
246
246
|
/* set pointers */
|
247
247
|
while (i > 0) {
|
248
|
-
i
|
248
|
+
--i;
|
249
249
|
s2[i].p = s2[i].pbeg + s2[i+1].p;
|
250
250
|
s1[i].p = s1[i].pbeg + s1[i+1].p;
|
251
251
|
si[i] = 0;
|
@@ -308,9 +308,9 @@ void
|
|
308
308
|
{
|
309
309
|
int i;
|
310
310
|
|
311
|
-
for (i=0; i<a->rank; i
|
311
|
+
for (i=0; i<a->rank; ++i)
|
312
312
|
shape[i] = a->shape[i];
|
313
|
-
for ( ; i<ndim; i
|
313
|
+
for ( ; i<ndim; ++i)
|
314
314
|
shape[i] = 1;
|
315
315
|
}
|
316
316
|
|
@@ -321,7 +321,7 @@ void
|
|
321
321
|
int i;
|
322
322
|
|
323
323
|
/* for normal access */
|
324
|
-
for (i=0; i<ndim; i
|
324
|
+
for (i=0; i<ndim; ++i) {
|
325
325
|
slc[i].n = shape[i];
|
326
326
|
slc[i].beg = 0;
|
327
327
|
slc[i].step = 1;
|
@@ -337,7 +337,7 @@ static int
|
|
337
337
|
{
|
338
338
|
int i, j;
|
339
339
|
|
340
|
-
for (i=j=0; i<ndim; i
|
340
|
+
for (i=j=0; i<ndim; ++i) {
|
341
341
|
|
342
342
|
if ( shp1[i]==1 && shp2[i]>1 ) {
|
343
343
|
s1[j].n =
|
@@ -378,7 +378,7 @@ static int
|
|
378
378
|
s2[j].beg = 0;
|
379
379
|
s1[j].idx =
|
380
380
|
s2[j].idx = NULL;
|
381
|
-
j
|
381
|
+
++j;
|
382
382
|
}
|
383
383
|
|
384
384
|
return j;
|
@@ -406,7 +406,7 @@ int
|
|
406
406
|
int i, j;
|
407
407
|
|
408
408
|
/* for repetitous access */
|
409
|
-
for (i=j=0; i<ndim; i
|
409
|
+
for (i=j=0; i<ndim; ++i) {
|
410
410
|
|
411
411
|
s1[j].step = na_set_slice_check(shp1[i],shape[i],i);
|
412
412
|
s2[j].step = na_set_slice_check(shp2[i],shape[i],i);
|
@@ -446,7 +446,7 @@ int
|
|
446
446
|
s2[j].idx =
|
447
447
|
s3[j].idx = NULL;
|
448
448
|
|
449
|
-
j
|
449
|
+
++j;
|
450
450
|
}
|
451
451
|
|
452
452
|
return j;
|
@@ -535,13 +535,13 @@ static void
|
|
535
535
|
NA_SWAP(a1,a2,tmp);
|
536
536
|
}
|
537
537
|
|
538
|
-
for (i=0; i<a2->rank; i
|
538
|
+
for (i=0; i<a2->rank; ++i) {
|
539
539
|
shape[i] = NA_MAX(a1->shape[i],a2->shape[i]);
|
540
540
|
}
|
541
|
-
for ( ; i<a1->rank; i
|
541
|
+
for ( ; i<a1->rank; ++i) {
|
542
542
|
shape[i] = a1->shape[i];
|
543
543
|
}
|
544
|
-
for ( ; i<ndim; i
|
544
|
+
for ( ; i<ndim; ++i) {
|
545
545
|
shape[i] = 1;
|
546
546
|
}
|
547
547
|
}
|
@@ -653,7 +653,6 @@ static VALUE
|
|
653
653
|
na_exec_binary( NA_STRUCT(obj3), a1, a2,
|
654
654
|
PowFuncs[a1->type][a2->type] );
|
655
655
|
|
656
|
-
//na_touch_object(obj1,obj2);
|
657
656
|
return obj3;
|
658
657
|
}
|
659
658
|
|
@@ -668,7 +667,6 @@ static VALUE
|
|
668
667
|
|
669
668
|
na_exec_unary( NA_STRUCT(obj1), NA_STRUCT(obj2), funcs[a1->type] );
|
670
669
|
|
671
|
-
//na_touch_object(obj2);
|
672
670
|
return obj1;
|
673
671
|
}
|
674
672
|
|
@@ -683,7 +681,6 @@ static VALUE
|
|
683
681
|
|
684
682
|
na_exec_unary( NA_STRUCT(obj1), NA_STRUCT(obj2), ImgSetFuncs[a1->type] );
|
685
683
|
|
686
|
-
//na_touch_object(obj2);
|
687
684
|
return obj1;
|
688
685
|
}
|
689
686
|
|
@@ -822,6 +819,10 @@ static VALUE na_div_bang(VALUE obj1, VALUE obj2)
|
|
822
819
|
static VALUE na_mul_bang(VALUE obj1, VALUE obj2)
|
823
820
|
{ return na_set_func( obj1, obj2, MulUFuncs ); }
|
824
821
|
|
822
|
+
/* method: self.conj! */
|
823
|
+
static VALUE na_conj_bang(VALUE self)
|
824
|
+
{ return na_set_func( self, self, ConjFuncs ); }
|
825
|
+
|
825
826
|
|
826
827
|
/* method: self.swap_byte */
|
827
828
|
static VALUE na_swap_byte(VALUE self)
|
@@ -932,7 +933,7 @@ static VALUE
|
|
932
933
|
p = a->ptr;
|
933
934
|
for( i=a->total; i-->0; ) {
|
934
935
|
*p = *p==0 ? 1 : 0;
|
935
|
-
p
|
936
|
+
++p;
|
936
937
|
}
|
937
938
|
return obj;
|
938
939
|
}
|
@@ -949,7 +950,7 @@ static VALUE
|
|
949
950
|
p = a->ptr;
|
950
951
|
for( i=a->total; i-->0; ) {
|
951
952
|
if (*p!=1) *p=0;
|
952
|
-
p
|
953
|
+
++p;
|
953
954
|
}
|
954
955
|
return self;
|
955
956
|
}
|
@@ -968,7 +969,7 @@ static VALUE
|
|
968
969
|
for( i=a->total; i-->0; ) {
|
969
970
|
if (*p==1 || *p==0) *p=1;
|
970
971
|
else *p=0;
|
971
|
-
p
|
972
|
+
++p;
|
972
973
|
}
|
973
974
|
return obj;
|
974
975
|
}
|
@@ -987,7 +988,7 @@ static VALUE
|
|
987
988
|
for( i=a->total; i-->0; ) {
|
988
989
|
if (*p==2) *p=1;
|
989
990
|
else *p=0;
|
990
|
-
p
|
991
|
+
++p;
|
991
992
|
}
|
992
993
|
return obj;
|
993
994
|
}
|
@@ -1006,7 +1007,7 @@ static VALUE
|
|
1006
1007
|
for( i=a->total; i-->0; ) {
|
1007
1008
|
if (*p==2 || *p==0) *p=1;
|
1008
1009
|
else *p=0;
|
1009
|
-
p
|
1010
|
+
++p;
|
1010
1011
|
}
|
1011
1012
|
return obj;
|
1012
1013
|
}
|
@@ -1036,7 +1037,7 @@ static int
|
|
1036
1037
|
if (flag==0)
|
1037
1038
|
MEMZERO(rankv,int,rankc);
|
1038
1039
|
|
1039
|
-
for (i=0;i<argc
|
1040
|
+
for (i=0;i<argc;++i) {
|
1040
1041
|
if ( c >= rankc )
|
1041
1042
|
rb_raise(rb_eArgError, "too many ranks");
|
1042
1043
|
|
@@ -1051,7 +1052,7 @@ static int
|
|
1051
1052
|
rankv[c] = r;
|
1052
1053
|
else
|
1053
1054
|
rankv[r] = 1;
|
1054
|
-
c
|
1055
|
+
++c;
|
1055
1056
|
}
|
1056
1057
|
else
|
1057
1058
|
if (CLASS_OF(v)==rb_cRange) {
|
@@ -1059,12 +1060,12 @@ static int
|
|
1059
1060
|
if ( c+n > rankc )
|
1060
1061
|
rb_raise(rb_eArgError, "too many ranks");
|
1061
1062
|
if (flag) {
|
1062
|
-
for(j=0; j<n; j
|
1063
|
+
for(j=0; j<n; ++j)
|
1063
1064
|
rankv[c++] = r++;
|
1064
1065
|
} else {
|
1065
|
-
for(j=0; j<n; j
|
1066
|
+
for(j=0; j<n; ++j) {
|
1066
1067
|
rankv[r++] = 1;
|
1067
|
-
c
|
1068
|
+
++c;
|
1068
1069
|
}
|
1069
1070
|
}
|
1070
1071
|
}
|
@@ -1091,7 +1092,7 @@ static struct NARRAY *
|
|
1091
1092
|
na_init_slice( s1, ndim, a2->shape, na_sizeof[a2->type] );
|
1092
1093
|
|
1093
1094
|
/* Transpose Slice */
|
1094
|
-
for (i=0; i<ndim; i
|
1095
|
+
for (i=0; i<ndim; ++i)
|
1095
1096
|
s2[i] = s1[trans[i]];
|
1096
1097
|
s2[ndim] = s1[ndim];
|
1097
1098
|
|
@@ -1123,18 +1124,18 @@ static VALUE
|
|
1123
1124
|
rankc = na_arg_to_rank( argc, argv, a2->rank, rankv, 1 );
|
1124
1125
|
if (rankc > a2->rank)
|
1125
1126
|
rb_raise(rb_eArgError, "too many args");
|
1126
|
-
for ( ;rankc<a2->rank; rankc
|
1127
|
+
for ( ;rankc<a2->rank; ++rankc)
|
1127
1128
|
rankv[rankc] = rankc;
|
1128
1129
|
|
1129
1130
|
/* Argument Check */
|
1130
1131
|
MEMZERO(shape,int,rankc);
|
1131
|
-
for (i=0; i<rankc; i
|
1132
|
+
for (i=0; i<rankc; ++i) {
|
1132
1133
|
if (shape[rankv[i]] != 0)
|
1133
1134
|
rb_raise(rb_eArgError,"rank doublebooking");
|
1134
1135
|
shape[rankv[i]] = 1;
|
1135
1136
|
}
|
1136
1137
|
|
1137
|
-
for (i=0; i<a2->rank; i
|
1138
|
+
for (i=0; i<a2->rank; ++i)
|
1138
1139
|
shape[i] = a2->shape[rankv[i]];
|
1139
1140
|
|
1140
1141
|
obj = na_make_object(a2->type, a2->rank, shape, CLASS_OF(self));
|
@@ -1155,13 +1156,13 @@ static void
|
|
1155
1156
|
|
1156
1157
|
if (rankc==0) {
|
1157
1158
|
/* Accumulate all elements */
|
1158
|
-
for (i=0; i<rank; i
|
1159
|
+
for (i=0; i<rank; ++i) {
|
1159
1160
|
itr_shape[i] = 1;
|
1160
1161
|
rankv[i] = 1;
|
1161
1162
|
}
|
1162
1163
|
} else {
|
1163
1164
|
/* Select Accumulate ranks */
|
1164
|
-
for (i=0; i<rank; i
|
1165
|
+
for (i=0; i<rank; ++i) {
|
1165
1166
|
if (rankv[i]==1)
|
1166
1167
|
itr_shape[i] = 1;
|
1167
1168
|
else
|
@@ -1178,7 +1179,7 @@ static void
|
|
1178
1179
|
VALUE zero = INT2FIX(0);
|
1179
1180
|
VALUE *v = (VALUE*)ary->ptr;
|
1180
1181
|
|
1181
|
-
for (i=ary->total; i>0; i
|
1182
|
+
for (i=ary->total; i>0; --i)
|
1182
1183
|
*(v++) = zero;
|
1183
1184
|
}
|
1184
1185
|
|
@@ -1281,7 +1282,6 @@ static VALUE
|
|
1281
1282
|
ans = na_shrink_rank(ans,cl_dim,rankv);
|
1282
1283
|
|
1283
1284
|
xfree(rankv);
|
1284
|
-
//na_touch_object(self,other);
|
1285
1285
|
return ans;
|
1286
1286
|
}
|
1287
1287
|
|
@@ -1358,7 +1358,7 @@ static void
|
|
1358
1358
|
s2 = &s1[ndim+1];
|
1359
1359
|
|
1360
1360
|
na_set_slice_1obj(a1->rank,s1,a1->shape);
|
1361
|
-
for (i=0; i<ndim; i
|
1361
|
+
for (i=0; i<ndim; ++i) {
|
1362
1362
|
s2[i].n = a1->shape[i]; /* no-repeat if a1->shape[i]==1 */
|
1363
1363
|
s2[i].beg = 0; /* copy idx=0 */
|
1364
1364
|
s2[i].step = 1;
|
@@ -1434,7 +1434,7 @@ static int
|
|
1434
1434
|
}
|
1435
1435
|
|
1436
1436
|
nsort = 1;
|
1437
|
-
for (i=0; i<=rank; i
|
1437
|
+
for (i=0; i<=rank; ++i)
|
1438
1438
|
nsort *= a1->shape[i];
|
1439
1439
|
return nsort;
|
1440
1440
|
}
|
@@ -1463,7 +1463,7 @@ static VALUE
|
|
1463
1463
|
ptr = a2->ptr;
|
1464
1464
|
step = size * nsort;
|
1465
1465
|
|
1466
|
-
for (i=0; i<nloop; i
|
1466
|
+
for (i=0; i<nloop; ++i) {
|
1467
1467
|
qsort( ptr, nsort, size, func );
|
1468
1468
|
ptr += step;
|
1469
1469
|
}
|
@@ -1490,7 +1490,7 @@ static VALUE
|
|
1490
1490
|
ptr = a1->ptr;
|
1491
1491
|
step = size * nsort;
|
1492
1492
|
|
1493
|
-
for (i=0; i<nloop; i
|
1493
|
+
for (i=0; i<nloop; ++i) {
|
1494
1494
|
qsort( ptr, nsort, size, func );
|
1495
1495
|
ptr += step;
|
1496
1496
|
}
|
@@ -1519,7 +1519,7 @@ static VALUE
|
|
1519
1519
|
ptr_p = ptr_ptr = ALLOC_N(char*, a1->total);
|
1520
1520
|
ptr_a = ptr_ary = a1->ptr;
|
1521
1521
|
|
1522
|
-
for (i=a1->total; i>0; i
|
1522
|
+
for (i=a1->total; i>0; --i) {
|
1523
1523
|
*(ptr_p++) = ptr_a;
|
1524
1524
|
ptr_a += size;
|
1525
1525
|
}
|
@@ -1527,7 +1527,7 @@ static VALUE
|
|
1527
1527
|
func = SortIdxFuncs[a1->type];
|
1528
1528
|
ptr_p = ptr_ptr;
|
1529
1529
|
|
1530
|
-
for (i=0; i<nloop; i
|
1530
|
+
for (i=0; i<nloop; ++i) {
|
1531
1531
|
qsort( ptr_p, nsort, sizeof(char*), func );
|
1532
1532
|
ptr_p += nsort;
|
1533
1533
|
}
|
@@ -1536,7 +1536,7 @@ static VALUE
|
|
1536
1536
|
GetNArray(obj,a2);
|
1537
1537
|
ptr_p = ptr_ptr;
|
1538
1538
|
ptr_i = (int32_t*)(a2->ptr);
|
1539
|
-
for (i=a2->total; i>0; i
|
1539
|
+
for (i=a2->total; i>0; --i) {
|
1540
1540
|
*(ptr_i++) = (int32_t)(*(ptr_p++)-ptr_ary)/size;
|
1541
1541
|
}
|
1542
1542
|
xfree(ptr_ptr);
|
@@ -1548,7 +1548,6 @@ static VALUE
|
|
1548
1548
|
void Init_na_funcs(void)
|
1549
1549
|
{
|
1550
1550
|
rb_define_method(cNArray, "+", na_add, 1);
|
1551
|
-
rb_define_method(cNArray, "*", na_mul, 1);
|
1552
1551
|
rb_define_method(cNArray, "-", na_sbt, 1);
|
1553
1552
|
rb_define_method(cNArray, "*", na_mul, 1);
|
1554
1553
|
rb_define_method(cNArray, "/", na_div, 1);
|
@@ -1559,7 +1558,6 @@ void Init_na_funcs(void)
|
|
1559
1558
|
rb_define_method(cNArray, "**", na_power, 1);
|
1560
1559
|
|
1561
1560
|
rb_define_method(cNArray, "add!", na_add_bang, 1);
|
1562
|
-
rb_define_method(cNArray, "mul!", na_mul_bang, 1);
|
1563
1561
|
rb_define_method(cNArray, "sbt!", na_sbt_bang, 1);
|
1564
1562
|
rb_define_method(cNArray, "mul!", na_mul_bang, 1);
|
1565
1563
|
rb_define_method(cNArray, "div!", na_div_bang, 1);
|
@@ -1580,6 +1578,8 @@ void Init_na_funcs(void)
|
|
1580
1578
|
rb_define_alias (cNArray, "arg", "angle");
|
1581
1579
|
rb_define_method(cNArray, "conj", na_conj, 0);
|
1582
1580
|
rb_define_alias (cNArray, "conjugate", "conj");
|
1581
|
+
rb_define_method(cNArray, "conj!", na_conj_bang, 0);
|
1582
|
+
rb_define_alias (cNArray, "conjugate!", "conj!");
|
1583
1583
|
rb_define_method(cNArray, "im", na_imag_mul, 0);
|
1584
1584
|
rb_define_method(cNArray, "floor",na_floor, 0);
|
1585
1585
|
rb_define_method(cNArray, "ceil", na_ceil, 0);
|
data/src/na_index.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
na_index.c
|
3
3
|
Numerical Array Extention for Ruby
|
4
|
-
(C) Copyright 1999-
|
4
|
+
(C) Copyright 1999-2008 by Masahiro TANAKA
|
5
5
|
|
6
6
|
This program is free software.
|
7
7
|
You can distribute/modify this program
|
@@ -47,18 +47,18 @@ static int
|
|
47
47
|
/* direction */
|
48
48
|
if (len>0) {
|
49
49
|
step = 1;
|
50
|
-
if (EXCL(obj)) end
|
50
|
+
if (EXCL(obj)) --end; else ++len;
|
51
51
|
}
|
52
52
|
else if (len<0) {
|
53
53
|
len = -len;
|
54
54
|
step = -1;
|
55
|
-
if (EXCL(obj)) end
|
55
|
+
if (EXCL(obj)) ++end; else ++len;
|
56
56
|
}
|
57
57
|
else /*if(len==0)*/ {
|
58
58
|
if (EXCL(obj))
|
59
59
|
rb_raise(rb_eIndexError, "empty range");
|
60
60
|
else {
|
61
|
-
len
|
61
|
+
++len;
|
62
62
|
step = 1; /* or 0 ? depend on whether removing rank */
|
63
63
|
}
|
64
64
|
}
|
@@ -120,11 +120,11 @@ static int
|
|
120
120
|
SetFuncs[NA_LINT][a1->type]( s->n,
|
121
121
|
s->idx, na_sizeof[NA_LINT],
|
122
122
|
a1->ptr, na_sizeof[a1->type] );
|
123
|
-
for ( i=a1->total; i>0; i
|
123
|
+
for ( i=a1->total; i>0; --i ) {
|
124
124
|
if ( *p<0 ) *p += size;
|
125
125
|
if ( *p<0 || *p>=size )
|
126
126
|
rb_raise(rb_eIndexError, "index %i out of range %i", *p, size);
|
127
|
-
p
|
127
|
+
++p;
|
128
128
|
}
|
129
129
|
s->beg = s->idx[0];
|
130
130
|
}
|
@@ -188,7 +188,6 @@ static int na_index_test(volatile VALUE idx, int shape, struct slice *sl)
|
|
188
188
|
idx = na_cast_object(idx,NA_LINT);
|
189
189
|
GetNArray(idx,na);
|
190
190
|
size = na_ary_to_index(na,shape,sl);
|
191
|
-
//na_touch_object(idx);
|
192
191
|
return size;
|
193
192
|
|
194
193
|
default:
|
@@ -220,11 +219,11 @@ static int
|
|
220
219
|
int i, j, k, total=1, size;
|
221
220
|
int multi_ellip=0;
|
222
221
|
|
223
|
-
for (i=j=0; i<nidx; i
|
222
|
+
for (i=j=0; i<nidx; ++i) {
|
224
223
|
if (TYPE(idx[i])==T_FALSE) {
|
225
224
|
if (multi_ellip!=0)
|
226
225
|
rb_raise(rb_eIndexError, "multiple ellipsis-dimension is not allowd");
|
227
|
-
for (k=ary->rank-nidx+1; k>0; k
|
226
|
+
for (k=ary->rank-nidx+1; k>0; --k,++j) {
|
228
227
|
size = na_index_test( Qtrue, ary->shape[j], &sl[j] );
|
229
228
|
if (size != 1)
|
230
229
|
total *= size;
|
@@ -234,7 +233,7 @@ static int
|
|
234
233
|
size = na_index_test( idx[i], ary->shape[j], &sl[j] );
|
235
234
|
if (size != 1)
|
236
235
|
total *= size;
|
237
|
-
j
|
236
|
+
++j;
|
238
237
|
}
|
239
238
|
}
|
240
239
|
if (j != ary->rank)
|
@@ -250,7 +249,7 @@ int
|
|
250
249
|
{
|
251
250
|
int i;
|
252
251
|
|
253
|
-
for (i=0; i<class_dim; i
|
252
|
+
for (i=0; i<class_dim; ++i) {
|
254
253
|
if (shrink[i]==0) /* non-trim dimention */
|
255
254
|
return 0;
|
256
255
|
}
|
@@ -270,19 +269,19 @@ VALUE
|
|
270
269
|
if (ary->rank < class_dim)
|
271
270
|
return obj;
|
272
271
|
|
273
|
-
for (j=i=0; i<class_dim; i
|
272
|
+
for (j=i=0; i<class_dim; ++i) {
|
274
273
|
if (ary->shape[i]!=1 || shrink[i]==0) /* not trim */
|
275
|
-
j
|
274
|
+
++j;
|
276
275
|
}
|
277
276
|
|
278
277
|
if (j>0) /* if non-trim dimensions exist, */
|
279
278
|
j = class_dim; /* then do not trim class_dimension. */
|
280
279
|
/* if (j==0) then all trim. */
|
281
280
|
|
282
|
-
for (i=class_dim; i<ary->rank; i
|
281
|
+
for (i=class_dim; i<ary->rank; ++i) {
|
283
282
|
if (ary->shape[i]!=1 || shrink[i]==0) { /* not trim */
|
284
283
|
if (i>j) ary->shape[j] = ary->shape[i];
|
285
|
-
j
|
284
|
+
++j;
|
286
285
|
}
|
287
286
|
}
|
288
287
|
ary->rank = j;
|
@@ -311,7 +310,7 @@ static VALUE
|
|
311
310
|
shape = ALLOCA_N(int,ndim);
|
312
311
|
shrink = ALLOCA_N(int,ndim);
|
313
312
|
|
314
|
-
for (i=0; i<ndim; i
|
313
|
+
for (i=0; i<ndim; ++i) {
|
315
314
|
shape[i] = s2[i].n;
|
316
315
|
if (shape[i]==1 && s2[i].step==0) /* shrink? */
|
317
316
|
shrink[i] = 1;
|
@@ -385,7 +384,6 @@ static VALUE
|
|
385
384
|
}
|
386
385
|
|
387
386
|
na_free_slice_index(s1,1);
|
388
|
-
//na_touch_object(vidx);
|
389
387
|
return v;
|
390
388
|
}
|
391
389
|
|
@@ -440,7 +438,7 @@ static VALUE
|
|
440
438
|
if (flag==0) {
|
441
439
|
rank = 0; /* [] */
|
442
440
|
for ( i=ary->rank; (i--)>0; ) {
|
443
|
-
if (sl[i].step!=0) rank
|
441
|
+
if (sl[i].step!=0) ++rank;
|
444
442
|
}
|
445
443
|
}
|
446
444
|
else {
|
@@ -460,7 +458,7 @@ static VALUE
|
|
460
458
|
class_dim = na_class_dim(klass);
|
461
459
|
if (rank < class_dim) rank = class_dim;
|
462
460
|
shape = ALLOCA_N(int, rank);
|
463
|
-
for (i=0;i<rank
|
461
|
+
for (i=0;i<rank;++i) shape[i]=1;
|
464
462
|
v = na_make_object(ary->type,rank,shape,klass);
|
465
463
|
GetNArray(v,arynew);
|
466
464
|
SetFuncs[ary->type][ary->type](1, arynew->ptr, 0, NA_PTR(ary,pos), 0);
|
@@ -515,7 +513,7 @@ static int
|
|
515
513
|
if ( ary->type == NA_BYTE ) {
|
516
514
|
ptr = (u_int8_t *)ary->ptr;
|
517
515
|
n = ary->total;
|
518
|
-
for (; n; n
|
516
|
+
for (; n; --n) {
|
519
517
|
if (*ptr++) ++count;
|
520
518
|
}
|
521
519
|
} else
|
@@ -541,7 +539,7 @@ static int
|
|
541
539
|
if ( ary->type == NA_BYTE ) {
|
542
540
|
ptr = (u_int8_t *)ary->ptr;
|
543
541
|
n = ary->total;
|
544
|
-
for (; n; n
|
542
|
+
for (; n; --n) {
|
545
543
|
if (!*ptr++) ++count;
|
546
544
|
}
|
547
545
|
} else
|
@@ -571,7 +569,7 @@ VALUE
|
|
571
569
|
if (a1->rank != am->rank)
|
572
570
|
rb_raise(rb_eTypeError,"self.rank(=%i) != mask.rank(=%i)",
|
573
571
|
a1->rank, am->rank);
|
574
|
-
for (i=0; i<a1->rank; i
|
572
|
+
for (i=0; i<a1->rank; ++i)
|
575
573
|
if (a1->shape[i] != am->shape[i])
|
576
574
|
rb_raise(rb_eTypeError,"self.shape[%i](=%i) != mask.shape[%i](=%i)",
|
577
575
|
i, a1->shape[i], i, am->shape[i]);
|
@@ -636,7 +634,7 @@ static void
|
|
636
634
|
{
|
637
635
|
int i;
|
638
636
|
|
639
|
-
for (i=0; i<rank; i
|
637
|
+
for (i=0; i<rank; ++i) {
|
640
638
|
src_shape[i] = 1; /* all 1 */
|
641
639
|
if ( (src_slc[i].n = dst_slc[i].n) < 1 )
|
642
640
|
rb_raise(rb_eIndexError, "dst_slice[%i].n=%i ???", i, dst_slc[i].n);
|
@@ -655,7 +653,7 @@ static void
|
|
655
653
|
int i, j, idx_end;
|
656
654
|
|
657
655
|
/* count range index */
|
658
|
-
for (j=i=0; i<dst->rank; i
|
656
|
+
for (j=i=0; i<dst->rank; ++i) {
|
659
657
|
|
660
658
|
if ( s1[i].step !=0 ) { /* Range index */
|
661
659
|
|
@@ -762,7 +760,7 @@ static void
|
|
762
760
|
rb_raise( rb_eIndexError, "idx.rank=%i != src.rank=%i",
|
763
761
|
aidx->rank, src->rank );
|
764
762
|
/* check shape */
|
765
|
-
for (i=0;i<src->rank
|
763
|
+
for (i=0;i<src->rank;++i)
|
766
764
|
if (aidx->shape[i] != src->shape[i] && src->shape[i] != 1)
|
767
765
|
rb_raise( rb_eIndexError, "idx.shape[%i]=%i != src.shape[%i]=%i",
|
768
766
|
i, aidx->shape[i], i, src->shape[i] );
|
@@ -781,7 +779,6 @@ static void
|
|
781
779
|
|
782
780
|
na_aset_slice( dst, src, sl );
|
783
781
|
na_free_slice_index( sl, 1 ); /* free index memory */
|
784
|
-
//na_touch_object(idx,val);
|
785
782
|
}
|
786
783
|
|
787
784
|
|
@@ -830,7 +827,6 @@ static void
|
|
830
827
|
na_aset_slice( dst, src, sl );
|
831
828
|
|
832
829
|
na_free_slice_index(sl,1); /* free index memory */
|
833
|
-
//na_touch_object(val);
|
834
830
|
}
|
835
831
|
|
836
832
|
|
@@ -858,7 +854,7 @@ static void
|
|
858
854
|
val = na_cast_unless_narray(val,dst->type);
|
859
855
|
GetNArray(val,src);
|
860
856
|
if (src->total > 1)
|
861
|
-
for( i=0; i<src->rank; i
|
857
|
+
for( i=0; i<src->rank; ++i ) {
|
862
858
|
sl[i].n = 0;
|
863
859
|
sl[i].step = 1;
|
864
860
|
}
|
@@ -886,7 +882,6 @@ static void
|
|
886
882
|
|
887
883
|
na_free_slice_index(sl,nidx); /* free index memory */
|
888
884
|
xfree(sl);
|
889
|
-
//na_touch_object(val);
|
890
885
|
}
|
891
886
|
|
892
887
|
|
@@ -913,7 +908,6 @@ static void
|
|
913
908
|
else {
|
914
909
|
na_fill( self, val ); /* Simple filling */
|
915
910
|
}
|
916
|
-
//na_touch_object(val);
|
917
911
|
}
|
918
912
|
|
919
913
|
|
@@ -933,7 +927,7 @@ void
|
|
933
927
|
if (a1->rank != am->rank)
|
934
928
|
rb_raise(rb_eTypeError,"self.rank(=%i) != mask.rank(=%i)",
|
935
929
|
a1->rank, am->rank);
|
936
|
-
for (i=0; i<a1->rank; i
|
930
|
+
for (i=0; i<a1->rank; ++i)
|
937
931
|
if (a1->shape[i] != am->shape[i])
|
938
932
|
rb_raise(rb_eTypeError,"self.shape[%i](=%i) != mask.shape[%i](=%i)",
|
939
933
|
i, a1->shape[i], i, am->shape[i]);
|
@@ -959,7 +953,7 @@ void
|
|
959
953
|
VALUE
|
960
954
|
na_aset(int nidx, VALUE *idx, VALUE self)
|
961
955
|
{
|
962
|
-
nidx
|
956
|
+
--nidx;
|
963
957
|
|
964
958
|
if (nidx==0) {
|
965
959
|
na_aset_fill( self, idx[0] );
|