numru-narray 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ChangeLog +602 -0
- data/MANIFEST +54 -0
- data/README +41 -0
- data/README_NARRAY.en +49 -0
- data/README_NARRAY.ja +52 -0
- data/SPEC.en +327 -0
- data/SPEC.ja +307 -0
- data/ext/numru/narray/depend +14 -0
- data/ext/numru/narray/extconf.rb +123 -0
- data/ext/numru/narray/mkmath.rb +792 -0
- data/ext/numru/narray/mknafunc.rb +212 -0
- data/ext/numru/narray/mkop.rb +733 -0
- data/ext/numru/narray/na_array.c +659 -0
- data/ext/numru/narray/na_func.c +1709 -0
- data/ext/numru/narray/na_index.c +1022 -0
- data/ext/numru/narray/na_linalg.c +635 -0
- data/ext/numru/narray/na_random.c +444 -0
- data/ext/numru/narray/narray.c +1344 -0
- data/ext/numru/narray/narray.def +29 -0
- data/ext/numru/narray/narray.h +231 -0
- data/ext/numru/narray/narray_local.h +218 -0
- data/lib/numru/narray.rb +4 -0
- data/lib/numru/narray_ext.rb +362 -0
- data/lib/numru/nmatrix.rb +248 -0
- metadata +95 -0
data/SPEC.ja
ADDED
@@ -0,0 +1,307 @@
|
|
1
|
+
|
2
|
+
Ruby/NArray ver 0.6.0.7 (2013-02-01) by Masahiro TANAKA
|
3
|
+
|
4
|
+
|
5
|
+
クラスメソッド:
|
6
|
+
NArray.new(typecode, size, ...) 配列を生成する。要素は0で初期化。
|
7
|
+
|
8
|
+
NArray.byte(size,...) 1 byte unsigned integer
|
9
|
+
NArray.sint(size,...) 2 byte signed integer
|
10
|
+
NArray.int(size,...) 4 byte signed integer
|
11
|
+
NArray.sfloat(size,...) single precision float
|
12
|
+
NArray.float(size,...) double precision float
|
13
|
+
NArray.scomplex(size,...) single precision complex
|
14
|
+
NArray.complex(size,...) double precision complex
|
15
|
+
NArray.object(size,...) Ruby object
|
16
|
+
以上要素は0またはnilで初期化。
|
17
|
+
|
18
|
+
NArray.to_na(array) NArrayに変換
|
19
|
+
NArray.to_na(string,type[,size,..])
|
20
|
+
NArray[...]
|
21
|
+
NArray[1,5,10.0] #=> NArray.float(3):[1.0, 5.0, 10.0]
|
22
|
+
NArray[1..10] #=> NArray.int(10):[1,2,3,4,5,6,7,8,9,10]
|
23
|
+
|
24
|
+
|
25
|
+
クラス変数:
|
26
|
+
CLASS_DIMENSION データとして扱われる次元。
|
27
|
+
NArrayは0。NVectorは1。NMatrixは2。
|
28
|
+
|
29
|
+
配列情報参照
|
30
|
+
self.dim 次元(インデックスの数)を返す。
|
31
|
+
self.rank 次元(インデックスの数)を返す。
|
32
|
+
self.shape 次元ごとのサイズを返す。
|
33
|
+
self.total 全要素数を返す。
|
34
|
+
|
35
|
+
インデックス参照
|
36
|
+
self[ dim0, dim1, ... ]
|
37
|
+
|
38
|
+
-- インデックス引数に指定できるもの: 数値、範囲、配列、true, false
|
39
|
+
-- インデックスの順序: FORTRAN 型
|
40
|
+
-- 添字引数が1つの場合、多次元配列はflattenされた1次元配列とみなされる。
|
41
|
+
例: a が 3x3 配列のとき、a[3] は a[0,1] の要素を指す。
|
42
|
+
|
43
|
+
a[ 1, 2, -1 ] 要素の取り出し。負数は最後から数える(-1が最後)
|
44
|
+
要素指定の次元は縮約される。
|
45
|
+
a[ 0..3, 4..1 ] 範囲取り出し。範囲の最後が最初より前ならば逆順になる。
|
46
|
+
a[ [1,4,2] ] インデックス配列。要素が[a[1],a[4],a[2]]のNArrayが返る。
|
47
|
+
a[] a.dup と同じ。
|
48
|
+
a[ 0, true ] a[0, 0..-1] と同じ。
|
49
|
+
a[ 0, false ] aが3次元のとき、a[0,true,true] と同じ。
|
50
|
+
省略された次元すべてにtrueを指定したのと同じ。
|
51
|
+
a[ mask ] マスキング. mask は長さが a と等しい byte 型
|
52
|
+
NArray. mask の各要素の値に応じて、a のそれぞ
|
53
|
+
れは落される(0の場合)か、保持される(0以外の場合)。
|
54
|
+
例:
|
55
|
+
a=NArray.float(2,2).indgen!
|
56
|
+
p a[ a.lt 3 ]
|
57
|
+
--> [ 0.0, 1.0, 2.0 ]
|
58
|
+
(a.lt 3 は byte 型 NArray を返す)
|
59
|
+
(同じことは a[ (a.lt 3).where ] でも出来る)
|
60
|
+
|
61
|
+
-- self.slice(...) self[...] と同じだが、長さが1になった次元を落
|
62
|
+
さず(self[]は落す)、もとのランクを保つ。但し、
|
63
|
+
1次元インデックス付けとマスキングは例外([]と同
|
64
|
+
じ)。
|
65
|
+
|
66
|
+
インデックス代入。-- 取出しとほぼ同じルール。
|
67
|
+
|
68
|
+
a[ 1, 2, 3 ] = 1
|
69
|
+
a[ 0..3, 1..4, 2..5 ] = 2
|
70
|
+
a[ [1,3,2,4], true ] = 3
|
71
|
+
a[] = 4 a.fill!(4) と同じ。
|
72
|
+
|
73
|
+
a[0..2] = b[1..5] --> 要素数が異なるのでエラー。
|
74
|
+
a[1,2] = b[0..2,1..3] [1,2]を始点として代入。
|
75
|
+
a[0..2,0..3] = b[0..2,1] 繰り返し代入。
|
76
|
+
( a[0,0]=b[0,1],..,a[0,3]=b[0,1] )
|
77
|
+
|
78
|
+
行・列の削除 -- インデックス取り出しの逆
|
79
|
+
|
80
|
+
self.delete_at(...) 引数はインデクス参照と同じ。
|
81
|
+
参照: https://github.com/masa16/narray/issues/5
|
82
|
+
|
83
|
+
値のセット。
|
84
|
+
self.indgen!([start[,step]]) startからstepづつ増加した値をセット。
|
85
|
+
self.fill!(value) すべての要素にvalueをセット。
|
86
|
+
self.random!(max) 0<=x<max の一様なランダム値を生成。
|
87
|
+
using MT19337
|
88
|
+
self.randomn 平均0、分散1の正規分布のランダム値を生成。
|
89
|
+
(Box-Muller)
|
90
|
+
NArray.srand([seed]) 乱数のシードを設定。
|
91
|
+
省略時は時刻から自動生成。
|
92
|
+
|
93
|
+
演算: 要素ごとにおこなう。
|
94
|
+
a = NArray.float(3,3).indgen
|
95
|
+
b = NArray.float(3,3).fill(10)
|
96
|
+
c = a*b # --> NArray.float(3,3)
|
97
|
+
|
98
|
+
a = NArray.float(3,1).indgen
|
99
|
+
b = NArray.float(1,3).fill(10)
|
100
|
+
c = a*b # --> NArray.float(3,3) -- size=1の次元は拡張する。
|
101
|
+
|
102
|
+
算術演算子
|
103
|
+
-self
|
104
|
+
self + other
|
105
|
+
self - other
|
106
|
+
self * other
|
107
|
+
self / other
|
108
|
+
self % other
|
109
|
+
self ** other
|
110
|
+
self.abs
|
111
|
+
|
112
|
+
self.add! other
|
113
|
+
self.sbt! other
|
114
|
+
self.mul! other
|
115
|
+
self.div! other
|
116
|
+
self.mod! other
|
117
|
+
|
118
|
+
self.mul_add(other,dim,...) (self * other).sum(dim,...)とほぼ同じ。
|
119
|
+
ただし途中で配列を作らない。
|
120
|
+
|
121
|
+
ビット演算子(整数のみ可能)
|
122
|
+
~self
|
123
|
+
self & other
|
124
|
+
self | other
|
125
|
+
self ^ other
|
126
|
+
|
127
|
+
比較
|
128
|
+
-- 要素ごとに値を比較し、結果をBYTE型 NArrayを返す。
|
129
|
+
true/falseでないことに注意。
|
130
|
+
self.eq other ( == とは異なることに注意)
|
131
|
+
self.ne other
|
132
|
+
self.gt other
|
133
|
+
self > other
|
134
|
+
self.ge other
|
135
|
+
self >= other
|
136
|
+
self.lt other
|
137
|
+
self < other
|
138
|
+
self.le other
|
139
|
+
self <= other
|
140
|
+
|
141
|
+
self.and other 要素ごとの条件比較。
|
142
|
+
self.or other
|
143
|
+
self.xor other
|
144
|
+
self.not other
|
145
|
+
|
146
|
+
self.all? 要素がすべて真ならば真。
|
147
|
+
self.any? 要素のどれかが真ならば真。
|
148
|
+
self.none? 要素のどれかが真ならば真。
|
149
|
+
self.where 要素が真のインデックス配列を返す。
|
150
|
+
self.where2 要素が真と偽のインデックス配列を含む(Ruby)配列を返す。
|
151
|
+
|
152
|
+
例: idx_t,idx_f = (a>12).where2
|
153
|
+
|
154
|
+
同値性
|
155
|
+
NArray[1] == NArray[1] #=> true
|
156
|
+
NArray[1] == NArray[1.0] #=> true
|
157
|
+
NArray[1].eql? NArray[1] #=> true
|
158
|
+
NArray[1].eql? NArray[1.0] #=> false
|
159
|
+
NArray[1].equal? NArray[1] #=> false
|
160
|
+
a=b=NArray[1]; a.equal? b #=> true
|
161
|
+
|
162
|
+
統計
|
163
|
+
self.sum(dim,..) 指定した次元の和
|
164
|
+
self.cumsum 累積和(1次元配列のみ)
|
165
|
+
self.prod(dim,..) 指定した次元の積
|
166
|
+
self.cumprod 累積積(1次元配列のみ)
|
167
|
+
self.mean(dim,..) 指定した次元の平均。
|
168
|
+
self.stddev(dim,..) 指定した次元の標準偏差(標本標準偏差)。
|
169
|
+
self.rms(dim,..) 指定した次元のroot mean square。
|
170
|
+
self.rmsdev(dim,..) 指定した次元のroot mean square deviation。
|
171
|
+
self.min(dim,..) 指定した次元の最小。
|
172
|
+
self.max(dim,..) 指定した次元の最大。
|
173
|
+
(省略時は全ての次元。Range指定可。)
|
174
|
+
self.median(dim) 0..dimの次元の中央値。省略時はすべての次元。
|
175
|
+
|
176
|
+
ソート
|
177
|
+
self.sort(dim) 0..dimの次元でソート。省略時はすべての次元。
|
178
|
+
self.sort_index(dim) ソートしたインデックスを返す。
|
179
|
+
self[self.sort_index] は self.sort と同等。
|
180
|
+
|
181
|
+
転置
|
182
|
+
self.transpose( dim0, dim1, .. )
|
183
|
+
配列の転置。selfの第(dim0)次元が新しい配列の第0次元になる。
|
184
|
+
負数は後からの順番。
|
185
|
+
transpose(-1,1..-2,0) で最初と最後を入れ換え。
|
186
|
+
|
187
|
+
インデックスの変更 (要素数は不変)
|
188
|
+
self.reshape!(size,...)
|
189
|
+
self.shape= size,...
|
190
|
+
self.newdim!(dim,...) 指定位置にサイズ1の次元を挿入する。
|
191
|
+
|
192
|
+
データの参照
|
193
|
+
self.refer selfのデータを参照する別のオブジェクトを作成。
|
194
|
+
self.reshape(size,...) self.refer.reshape! と同様。
|
195
|
+
self.newdim(dim,...) self.refer.newdim! と同様。
|
196
|
+
|
197
|
+
反転・回転
|
198
|
+
self.reverse([dim,...]) 指定した次元を逆順にする
|
199
|
+
self.rot90([k]) 2次元配列の90度の回転をk回行う
|
200
|
+
|
201
|
+
型変換
|
202
|
+
self.floor selfより小さい最大の整数を返す。
|
203
|
+
self.ceil selfより大きい最小の整数を返す。
|
204
|
+
self.round selfにもっとも近い整数を返す。
|
205
|
+
self.to_f 値を浮動小数点数に変換する。
|
206
|
+
self.to_i 値を整数に変換する。
|
207
|
+
self.to_a 値をRubyの配列に変換する。
|
208
|
+
self.to_s バイナリデータをそのままRubyの文字列データに変換する。
|
209
|
+
self.to_string 各要素を文字列に変換する。
|
210
|
+
|
211
|
+
イテレータ
|
212
|
+
self.each {|i| ...}
|
213
|
+
self.collect {|i| ...}
|
214
|
+
self.collect! {|i| ...}
|
215
|
+
|
216
|
+
バイトスワップ
|
217
|
+
self.swap_byte バイトスワップ
|
218
|
+
self.hton ネットワークバイトオーダーに変換
|
219
|
+
self.ntoh
|
220
|
+
self.htov VAXバイトオーダーに変換
|
221
|
+
self.vtoh
|
222
|
+
|
223
|
+
Boolean / マスク関係
|
224
|
+
self.count_false 値 == 0 の要素数 (byte型のみ)
|
225
|
+
self.count_true 値 == 1 の要素数 (byte型のみ)
|
226
|
+
self.mask( mask ) self[ mask ] と同じだかマスキング専用.
|
227
|
+
[] と違い int, sint のマスクも使える.
|
228
|
+
|
229
|
+
複素数
|
230
|
+
self.real
|
231
|
+
self.imag
|
232
|
+
self.conj
|
233
|
+
self.conj!
|
234
|
+
self.angle atan2(self.imag, self.real)
|
235
|
+
self.imag= other 虚数部分にotherをセット。
|
236
|
+
self.im 虚数倍。
|
237
|
+
|
238
|
+
NMath モジュール
|
239
|
+
sqrt(x)
|
240
|
+
exp(x)
|
241
|
+
log(x)
|
242
|
+
log10(x)
|
243
|
+
log2(x)
|
244
|
+
atan2(x,y)
|
245
|
+
sin,cos,tan
|
246
|
+
sinh,cosh,tanh
|
247
|
+
asin,acos,atan
|
248
|
+
asinh,acosh,atanh
|
249
|
+
csc,sec,cot
|
250
|
+
csch,sech,coth
|
251
|
+
acsc,asec,acot
|
252
|
+
acsch,asech,acoth
|
253
|
+
covariance
|
254
|
+
|
255
|
+
|
256
|
+
FFTW モジュール (fftw-2.1.3をshared libでコンパイルしたもので確認)
|
257
|
+
(別モジュール)
|
258
|
+
fftw(x,[1|-1])
|
259
|
+
convol(a,b) FFTWを用いた畳み込み。
|
260
|
+
|
261
|
+
|
262
|
+
NMatrix
|
263
|
+
|
264
|
+
NArrayのサブクラス。最初の2次元をMatrixとして用いる。
|
265
|
+
残りの次元は多次元配列として扱われる。
|
266
|
+
次元の順序は、数学での表記とは逆: a_ij => a[j,i]
|
267
|
+
|
268
|
+
メソッド:
|
269
|
+
+,- 相手が NMatrix のときに演算可。
|
270
|
+
* 相手が NMatrix または NVector のときは Matrix積。
|
271
|
+
相手が Numeric または NArray のときは Scalar積。
|
272
|
+
例: NMatrix[[1,2],[3,4]] * [1,10]
|
273
|
+
== NMatrix[ [[1,2],[3,4]], [[10,20],[30,40]] ]
|
274
|
+
/ 相手が Numeric または NArray のときはScalar除算。
|
275
|
+
相手が square NMatrix のときはLUにより線形方程式を解く。
|
276
|
+
a/b == b.lu.solve(a)
|
277
|
+
|
278
|
+
transpose 引数を省略した場合は、最初のMatrix次元を交換。
|
279
|
+
diagonal(other)
|
280
|
+
diagonal!(other) 対角要素に値をセット。引数省略時は1をセット。
|
281
|
+
I 対角要素に値に1をセット。
|
282
|
+
inverse 逆行列
|
283
|
+
lu LU分解を計算。NMatrixLU クラスのインスタンスを返す。
|
284
|
+
|
285
|
+
|
286
|
+
NVector
|
287
|
+
|
288
|
+
NArrayのサブクラス。最初の1次元をVectorとして用いる。
|
289
|
+
残りの次元は多次元配列として扱われる。
|
290
|
+
|
291
|
+
メソッド:
|
292
|
+
+,- 相手が NVector のときに演算可。
|
293
|
+
* 相手が NMatrix のときは Matrix積。
|
294
|
+
相手が NVector のときは 内積。
|
295
|
+
相手が Numeric または NArray のときは Scalar積。
|
296
|
+
/ 相手が Numeric または NArray のときは Scalar除算。
|
297
|
+
相手が square NMatrix のときはLUにより線形方程式を解く。
|
298
|
+
v/m == m.lu.solve(v)
|
299
|
+
|
300
|
+
NMatrixLU
|
301
|
+
|
302
|
+
NMatrix#lu メソッドにより作られる。
|
303
|
+
LU (NMatrix) と pivot (NVector) を含む。
|
304
|
+
|
305
|
+
メソッド:
|
306
|
+
solve(other) LU分解の結果を使って other を解く。
|
307
|
+
other は NMatrix または NVector のインスタンス。
|
@@ -0,0 +1,14 @@
|
|
1
|
+
na_op.c: mknafunc.rb mkop.rb
|
2
|
+
$(RUBY) -I$(srcdir) $(srcdir)/mkop.rb
|
3
|
+
|
4
|
+
na_op.o: na_op.c narray.h $(hdrdir)/ruby.h
|
5
|
+
|
6
|
+
|
7
|
+
na_math.c: mknafunc.rb mkmath.rb
|
8
|
+
$(RUBY) -I$(srcdir) $(srcdir)/mkmath.rb
|
9
|
+
|
10
|
+
na_math.o: na_math.c narray.h $(hdrdir)/ruby.h
|
11
|
+
|
12
|
+
|
13
|
+
cleanall: clean
|
14
|
+
@$(RM) -r Makefile narray_config.h na_op.c na_math.c src pkg
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require "mkmf"
|
2
|
+
|
3
|
+
def have_type(type, header=nil)
|
4
|
+
printf "checking for %s... ", type
|
5
|
+
STDOUT.flush
|
6
|
+
src = <<"SRC"
|
7
|
+
#include <ruby.h>
|
8
|
+
SRC
|
9
|
+
unless header.nil?
|
10
|
+
src << <<"SRC"
|
11
|
+
#include <#{header}>
|
12
|
+
SRC
|
13
|
+
end
|
14
|
+
r = try_link(src + <<"SRC")
|
15
|
+
int main() { return 0; }
|
16
|
+
int t() { #{type} a; return 0; }
|
17
|
+
SRC
|
18
|
+
unless r
|
19
|
+
print "no\n"
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
$defs.push(format("-DHAVE_%s", type.upcase))
|
23
|
+
print "yes\n"
|
24
|
+
return true
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_conf_h(file)
|
28
|
+
print "creating #{file}\n"
|
29
|
+
hfile = open(file, "w")
|
30
|
+
for line in $defs
|
31
|
+
line =~ /^-D(.*)/
|
32
|
+
hfile.printf "#define %s 1\n", $1
|
33
|
+
end
|
34
|
+
hfile.close
|
35
|
+
end
|
36
|
+
|
37
|
+
if RUBY_VERSION < '1.8'
|
38
|
+
alias __install_rb :install_rb
|
39
|
+
def install_rb(mfile, dest, srcdir = nil)
|
40
|
+
__install_rb(mfile, dest, srcdir)
|
41
|
+
archdir = dest.sub(/sitelibdir/,"sitearchdir").sub(/rubylibdir/,"archdir")
|
42
|
+
path = ['$(srcdir)/narray.h','narray_config.h']
|
43
|
+
path << ['libnarray.a'] if /cygwin|mingw/ =~ RUBY_PLATFORM
|
44
|
+
for f in path
|
45
|
+
mfile.printf "\t@$(RUBY) -r ftools -e 'File::install(ARGV[0], ARGV[1], 0644, true)' %s %s\n", f, archdir
|
46
|
+
end
|
47
|
+
end
|
48
|
+
else
|
49
|
+
$INSTALLFILES = [['narray.h', '$(archdir)'], ['narray_config.h', '$(archdir)']]
|
50
|
+
if /cygwin|mingw/ =~ RUBY_PLATFORM
|
51
|
+
$INSTALLFILES << ['libnarray.a', '$(archdir)']
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if /cygwin|mingw/ =~ RUBY_PLATFORM
|
56
|
+
if RUBY_VERSION >= '1.9.0'
|
57
|
+
$DLDFLAGS << " -Wl,--export-all,--out-implib=libnarray.a"
|
58
|
+
elsif RUBY_VERSION > '1.8.0'
|
59
|
+
$DLDFLAGS << ",--out-implib=libnarray.a"
|
60
|
+
elsif RUBY_VERSION > '1.8'
|
61
|
+
CONFIG["DLDFLAGS"] << ",--out-implib=libnarray.a"
|
62
|
+
system("touch libnarray.a")
|
63
|
+
else
|
64
|
+
CONFIG["DLDFLAGS"] << " --output-lib libnarray.a"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
case RbConfig::CONFIG["CC"]
|
70
|
+
when "gcc"
|
71
|
+
omp_opt = "-fopenmp"
|
72
|
+
else
|
73
|
+
omp_opt = nil
|
74
|
+
end
|
75
|
+
omp_opt = arg_config("--openmp", omp_opt)
|
76
|
+
|
77
|
+
omp_opt = nil if omp_opt.to_s.empty?
|
78
|
+
|
79
|
+
if omp_opt
|
80
|
+
$CFLAGS << " " << omp_opt
|
81
|
+
$DLDFLAGS << " " << omp_opt
|
82
|
+
warn "OpenMP support: ON"
|
83
|
+
else
|
84
|
+
warn "OpenMP support: OFF"
|
85
|
+
warn "if you want to enable openmp, set --openmp=compile_option"
|
86
|
+
end
|
87
|
+
|
88
|
+
#$DEBUG = true
|
89
|
+
#$CFLAGS = ["-Wall",$CFLAGS].join(" ")
|
90
|
+
|
91
|
+
srcs = %w(
|
92
|
+
narray
|
93
|
+
na_array
|
94
|
+
na_func
|
95
|
+
na_index
|
96
|
+
na_random
|
97
|
+
na_op
|
98
|
+
na_math
|
99
|
+
na_linalg
|
100
|
+
)
|
101
|
+
|
102
|
+
header = "stdint.h"
|
103
|
+
unless have_header(header)
|
104
|
+
header = "sys/types.h"
|
105
|
+
unless have_header(header)
|
106
|
+
header = nil
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
have_type("u_int8_t", header)
|
111
|
+
have_type("uint8_t", header)
|
112
|
+
have_type("int16_t", header)
|
113
|
+
have_type("int32_t", header)
|
114
|
+
have_type("int64_t", header)
|
115
|
+
have_type("u_int32_t", header)
|
116
|
+
have_type("uint32_t", header)
|
117
|
+
have_type("u_int64_t", header)
|
118
|
+
have_type("uint64_t", header)
|
119
|
+
|
120
|
+
$objs = srcs.collect{|i| i+".o"}
|
121
|
+
|
122
|
+
create_conf_h("narray_config.h")
|
123
|
+
create_makefile("numru/narray/narray")
|