pnmatrix 1.2.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 +7 -0
- data/ext/nmatrix/binary_format.txt +53 -0
- data/ext/nmatrix/data/complex.h +388 -0
- data/ext/nmatrix/data/data.cpp +274 -0
- data/ext/nmatrix/data/data.h +651 -0
- data/ext/nmatrix/data/meta.h +64 -0
- data/ext/nmatrix/data/ruby_object.h +386 -0
- data/ext/nmatrix/extconf.rb +70 -0
- data/ext/nmatrix/math/asum.h +99 -0
- data/ext/nmatrix/math/cblas_enums.h +36 -0
- data/ext/nmatrix/math/cblas_templates_core.h +507 -0
- data/ext/nmatrix/math/gemm.h +241 -0
- data/ext/nmatrix/math/gemv.h +178 -0
- data/ext/nmatrix/math/getrf.h +255 -0
- data/ext/nmatrix/math/getrs.h +121 -0
- data/ext/nmatrix/math/imax.h +82 -0
- data/ext/nmatrix/math/laswp.h +165 -0
- data/ext/nmatrix/math/long_dtype.h +62 -0
- data/ext/nmatrix/math/magnitude.h +54 -0
- data/ext/nmatrix/math/math.h +751 -0
- data/ext/nmatrix/math/nrm2.h +165 -0
- data/ext/nmatrix/math/rot.h +117 -0
- data/ext/nmatrix/math/rotg.h +106 -0
- data/ext/nmatrix/math/scal.h +71 -0
- data/ext/nmatrix/math/trsm.h +336 -0
- data/ext/nmatrix/math/util.h +162 -0
- data/ext/nmatrix/math.cpp +1368 -0
- data/ext/nmatrix/nm_memory.h +60 -0
- data/ext/nmatrix/nmatrix.cpp +285 -0
- data/ext/nmatrix/nmatrix.h +476 -0
- data/ext/nmatrix/ruby_constants.cpp +151 -0
- data/ext/nmatrix/ruby_constants.h +106 -0
- data/ext/nmatrix/ruby_nmatrix.c +3130 -0
- data/ext/nmatrix/storage/common.cpp +77 -0
- data/ext/nmatrix/storage/common.h +183 -0
- data/ext/nmatrix/storage/dense/dense.cpp +1096 -0
- data/ext/nmatrix/storage/dense/dense.h +129 -0
- data/ext/nmatrix/storage/list/list.cpp +1628 -0
- data/ext/nmatrix/storage/list/list.h +138 -0
- data/ext/nmatrix/storage/storage.cpp +730 -0
- data/ext/nmatrix/storage/storage.h +99 -0
- data/ext/nmatrix/storage/yale/class.h +1139 -0
- data/ext/nmatrix/storage/yale/iterators/base.h +143 -0
- data/ext/nmatrix/storage/yale/iterators/iterator.h +131 -0
- data/ext/nmatrix/storage/yale/iterators/row.h +450 -0
- data/ext/nmatrix/storage/yale/iterators/row_stored.h +140 -0
- data/ext/nmatrix/storage/yale/iterators/row_stored_nd.h +169 -0
- data/ext/nmatrix/storage/yale/iterators/stored_diagonal.h +124 -0
- data/ext/nmatrix/storage/yale/math/transpose.h +110 -0
- data/ext/nmatrix/storage/yale/yale.cpp +2074 -0
- data/ext/nmatrix/storage/yale/yale.h +203 -0
- data/ext/nmatrix/types.h +55 -0
- data/ext/nmatrix/util/io.cpp +279 -0
- data/ext/nmatrix/util/io.h +115 -0
- data/ext/nmatrix/util/sl_list.cpp +627 -0
- data/ext/nmatrix/util/sl_list.h +144 -0
- data/ext/nmatrix/util/util.h +78 -0
- data/lib/nmatrix/blas.rb +378 -0
- data/lib/nmatrix/cruby/math.rb +744 -0
- data/lib/nmatrix/enumerate.rb +253 -0
- data/lib/nmatrix/homogeneous.rb +241 -0
- data/lib/nmatrix/io/fortran_format.rb +138 -0
- data/lib/nmatrix/io/harwell_boeing.rb +221 -0
- data/lib/nmatrix/io/market.rb +263 -0
- data/lib/nmatrix/io/point_cloud.rb +189 -0
- data/lib/nmatrix/jruby/decomposition.rb +24 -0
- data/lib/nmatrix/jruby/enumerable.rb +13 -0
- data/lib/nmatrix/jruby/error.rb +4 -0
- data/lib/nmatrix/jruby/math.rb +501 -0
- data/lib/nmatrix/jruby/nmatrix_java.rb +840 -0
- data/lib/nmatrix/jruby/operators.rb +283 -0
- data/lib/nmatrix/jruby/slice.rb +264 -0
- data/lib/nmatrix/lapack_core.rb +181 -0
- data/lib/nmatrix/lapack_plugin.rb +44 -0
- data/lib/nmatrix/math.rb +953 -0
- data/lib/nmatrix/mkmf.rb +100 -0
- data/lib/nmatrix/monkeys.rb +137 -0
- data/lib/nmatrix/nmatrix.rb +1172 -0
- data/lib/nmatrix/rspec.rb +75 -0
- data/lib/nmatrix/shortcuts.rb +1163 -0
- data/lib/nmatrix/version.rb +39 -0
- data/lib/nmatrix/yale_functions.rb +118 -0
- data/lib/nmatrix.rb +28 -0
- data/spec/00_nmatrix_spec.rb +892 -0
- data/spec/01_enum_spec.rb +196 -0
- data/spec/02_slice_spec.rb +407 -0
- data/spec/03_nmatrix_monkeys_spec.rb +80 -0
- data/spec/2x2_dense_double.mat +0 -0
- data/spec/4x4_sparse.mat +0 -0
- data/spec/4x5_dense.mat +0 -0
- data/spec/blas_spec.rb +215 -0
- data/spec/elementwise_spec.rb +311 -0
- data/spec/homogeneous_spec.rb +100 -0
- data/spec/io/fortran_format_spec.rb +88 -0
- data/spec/io/harwell_boeing_spec.rb +98 -0
- data/spec/io/test.rua +9 -0
- data/spec/io_spec.rb +159 -0
- data/spec/lapack_core_spec.rb +482 -0
- data/spec/leakcheck.rb +16 -0
- data/spec/math_spec.rb +1363 -0
- data/spec/nmatrix_yale_resize_test_associations.yaml +2802 -0
- data/spec/nmatrix_yale_spec.rb +286 -0
- data/spec/rspec_monkeys.rb +56 -0
- data/spec/rspec_spec.rb +35 -0
- data/spec/shortcuts_spec.rb +474 -0
- data/spec/slice_set_spec.rb +162 -0
- data/spec/spec_helper.rb +172 -0
- data/spec/stat_spec.rb +214 -0
- data/spec/test.pcd +20 -0
- data/spec/utm5940.mtx +83844 -0
- metadata +295 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
# = NMatrix
|
|
2
|
+
#
|
|
3
|
+
# A linear algebra library for scientific computation in Ruby.
|
|
4
|
+
# NMatrix is part of SciRuby.
|
|
5
|
+
#
|
|
6
|
+
# NMatrix was originally inspired by and derived from NArray, by
|
|
7
|
+
# Masahiro Tanaka: http://narray.rubyforge.org
|
|
8
|
+
#
|
|
9
|
+
# == Copyright Information
|
|
10
|
+
#
|
|
11
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
|
12
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
|
13
|
+
#
|
|
14
|
+
# Please see LICENSE.txt for additional copyright notices.
|
|
15
|
+
#
|
|
16
|
+
# == Contributing
|
|
17
|
+
#
|
|
18
|
+
# By contributing source code to SciRuby, you agree to be bound by
|
|
19
|
+
# our Contributor Agreement:
|
|
20
|
+
#
|
|
21
|
+
# * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
|
|
22
|
+
#
|
|
23
|
+
# == shortcuts_spec.rb
|
|
24
|
+
#
|
|
25
|
+
# Specs for the shortcuts used in NMatrix and in NVector.
|
|
26
|
+
#
|
|
27
|
+
|
|
28
|
+
require 'spec_helper'
|
|
29
|
+
require 'pry'
|
|
30
|
+
|
|
31
|
+
describe NMatrix do
|
|
32
|
+
it "zeros() creates a matrix of zeros" do
|
|
33
|
+
m = NMatrix.zeros(3)
|
|
34
|
+
n = NMatrix.new([3, 3], 0)
|
|
35
|
+
|
|
36
|
+
expect(m).to eq n
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "ones() creates a matrix of ones" do
|
|
40
|
+
m = NMatrix.ones(3)
|
|
41
|
+
n = NMatrix.new([3, 3], 1)
|
|
42
|
+
|
|
43
|
+
expect(m).to eq n
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "eye() creates an identity matrix" do
|
|
47
|
+
m = NMatrix.eye(3)
|
|
48
|
+
identity3 = NMatrix.new([3, 3], [1, 0, 0, 0, 1, 0, 0, 0, 1])
|
|
49
|
+
|
|
50
|
+
expect(m).to eq identity3
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "hilbert() creates an hilbert matrix" do
|
|
54
|
+
m = NMatrix.hilbert(8)
|
|
55
|
+
expect(m[4, 0]).to be_within(0.000001).of(0.2)
|
|
56
|
+
expect(m[4, 1]).to be_within(0.000001).of(0.16666666666666666)
|
|
57
|
+
expect(m[4, 2]).to be_within(0.000001).of(0.14285714285714285)
|
|
58
|
+
expect(m[4, 3]).to be_within(0.000001).of(0.125)
|
|
59
|
+
|
|
60
|
+
m = NMatrix.hilbert(3)
|
|
61
|
+
hilbert3 = NMatrix.new([3, 3], [1.0, 0.5, 0.3333333333333333,\
|
|
62
|
+
0.5, 0.3333333333333333, 0.25, 0.3333333333333333, 0.25, 0.2])
|
|
63
|
+
expect(m).to eq hilbert3
|
|
64
|
+
0.upto(2) do |i|
|
|
65
|
+
0.upto(2) do |j|
|
|
66
|
+
expect(m[i, j]).to be_within(0.000001).of(hilbert3[i,j])
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "inv_hilbert() creates an inverse hilbert matrix" do
|
|
72
|
+
m = NMatrix.inv_hilbert(6)
|
|
73
|
+
inv_hilbert6 = [3360.0, -88200.0, 564480.0, -1411200.0]
|
|
74
|
+
expect(m[2,0]).to be_within(0.000001).of(inv_hilbert6[0])
|
|
75
|
+
expect(m[2,1]).to be_within(0.000001).of(inv_hilbert6[1])
|
|
76
|
+
expect(m[2,2]).to be_within(0.000001).of(inv_hilbert6[2])
|
|
77
|
+
expect(m[2,3]).to be_within(0.000001).of(inv_hilbert6[3])
|
|
78
|
+
|
|
79
|
+
m = NMatrix.inv_hilbert(3)
|
|
80
|
+
inv_hilbert3 = NMatrix.new([3, 3], [ 9.0, -36.0, 30.0, -36.0, 192.0, -180.0, 30.0, -180.0, 180.0] )
|
|
81
|
+
0.upto(2) do |i|
|
|
82
|
+
0.upto(2) do |j|
|
|
83
|
+
expect(m[i, j]).to be_within(0.000001).of(inv_hilbert3[i,j])
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "diag() creates a matrix with pre-supplied diagonal" do
|
|
89
|
+
arr = [1,2,3,4]
|
|
90
|
+
m = NMatrix.diag(arr)
|
|
91
|
+
expect(m.is_a?(NMatrix)).to be true
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "diagonals() contains the seeded values on the diagonal" do
|
|
95
|
+
arr = [1,2,3,4]
|
|
96
|
+
m = NMatrix.diagonals(arr)
|
|
97
|
+
expect(m[0,0]).to eq(arr[0])
|
|
98
|
+
expect(m[1,1]).to eq(arr[1])
|
|
99
|
+
expect(m[2,2]).to eq(arr[2])
|
|
100
|
+
expect(m[3,3]).to eq(arr[3])
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
ALL_DTYPES.each do |dtype|
|
|
104
|
+
[:dense, :yale, :list].each do |stype|
|
|
105
|
+
context "#block_diagonal #{dtype} #{stype}" do
|
|
106
|
+
it "block_diagonal() creates a block-diagonal NMatrix" do
|
|
107
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby? and dtype == :object
|
|
108
|
+
a = NMatrix.new([2,2], [1,2,
|
|
109
|
+
3,4])
|
|
110
|
+
b = NMatrix.new([1,1], [123.0])
|
|
111
|
+
c = NMatrix.new([3,3], [1,2,3,
|
|
112
|
+
1,2,3,
|
|
113
|
+
1,2,3])
|
|
114
|
+
d = Array[ [1,1,1], [2,2,2], [3,3,3] ]
|
|
115
|
+
e = 12
|
|
116
|
+
m = NMatrix.block_diagonal(a, b, c, d, e, dtype: dtype, stype: stype)
|
|
117
|
+
expect(m).to eq(NMatrix.new([10,10], [1, 2, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
118
|
+
3, 4, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
119
|
+
0, 0, 123, 0, 0, 0, 0, 0, 0, 0,
|
|
120
|
+
0, 0, 0, 1, 2, 3, 0, 0, 0, 0,
|
|
121
|
+
0, 0, 0, 1, 2, 3, 0, 0, 0, 0,
|
|
122
|
+
0, 0, 0, 1, 2, 3, 0, 0, 0, 0,
|
|
123
|
+
0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
|
|
124
|
+
0, 0, 0, 0, 0, 0, 2, 2, 2, 0,
|
|
125
|
+
0, 0, 0, 0, 0, 0, 3, 3, 3, 0,
|
|
126
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 12], dtype: dtype, stype: stype))
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
context "::random" do
|
|
133
|
+
it "creates a matrix of random numbers" do
|
|
134
|
+
m = NMatrix.random(2)
|
|
135
|
+
|
|
136
|
+
expect(m.stype).to eq(:dense)
|
|
137
|
+
expect(m.dtype).to eq(:float64)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "creates a matrix of random numbers with defined seed value" do
|
|
141
|
+
m1 = NMatrix.random(2,:seed => 62)
|
|
142
|
+
m2 = NMatrix.random(2,:seed => 62)
|
|
143
|
+
m3 = NMatrix.random(2,:seed => 65)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
expect(m1).to eq(m2)
|
|
147
|
+
expect(m1).not_to eq(m3)
|
|
148
|
+
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "creates a complex matrix of random numbers" do
|
|
152
|
+
m = NMatrix.random(2, :dtype => :complex128)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "correctly accepts :scale parameter" do
|
|
156
|
+
m = NMatrix.random([2,2], dtype: :byte, scale: 255)
|
|
157
|
+
m.each do |v|
|
|
158
|
+
expect(v).to be >= 0
|
|
159
|
+
expect(v).to be < 255
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "only accepts an integer or an array as dimension" do
|
|
164
|
+
m = NMatrix.random([2, 2])
|
|
165
|
+
|
|
166
|
+
expect(m.stype).to eq(:dense)
|
|
167
|
+
expect(m.dtype).to eq(:float64)
|
|
168
|
+
|
|
169
|
+
expect { NMatrix.random(2.0) }.to raise_error
|
|
170
|
+
expect { NMatrix.random("not an array or integer") }.to raise_error
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
context "::magic" do
|
|
175
|
+
|
|
176
|
+
ALL_DTYPES.each do |dtype|
|
|
177
|
+
context dtype do
|
|
178
|
+
it "creates a matrix with numbers from 1 to n^n(n squared)" do
|
|
179
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
180
|
+
a = NMatrix.magic(3, dtype: dtype)
|
|
181
|
+
magic3 = NMatrix.new([3,3], [4, 9, 2, 3, 5, 7, 8, 1, 6], dtype: dtype)
|
|
182
|
+
expect(a).to eq magic3
|
|
183
|
+
|
|
184
|
+
b = NMatrix.magic(4, dtype: dtype)
|
|
185
|
+
magic4 = NMatrix.new([4,4], [1, 15, 14, 4, 12, 6, 7, 9, 8, 10, 11, 5, 13, 3, 2, 16], dtype: dtype)
|
|
186
|
+
expect(b).to eq magic4
|
|
187
|
+
|
|
188
|
+
c = NMatrix.magic(6, dtype: dtype)
|
|
189
|
+
magic6 = NMatrix.new([6,6], [31, 9, 2, 22, 27, 20, 3, 32, 7, 21, 23, 25, 35, 1, 6, 26, 19, 24, 4, 36, 29, 13, 18, 11, 30, 5, 34, 12, 14, 16, 8, 28, 33, 17, 10, 15], dtype: dtype)
|
|
190
|
+
expect(c).to eq magic6
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
it "shape of two is not allowed" do
|
|
196
|
+
expect { NMatrix.magic(2) }.to raise_error(ArgumentError)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "Only accepts an integer as dimension" do
|
|
200
|
+
expect { NMatrix.magic(3.0) }.to raise_error(ArgumentError)
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
context "::linspace" do
|
|
205
|
+
it "creates a row vector when given only one shape parameter" do
|
|
206
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
207
|
+
v = NMatrix.linspace(1, 10, 4)
|
|
208
|
+
#Expect a row vector only
|
|
209
|
+
expect(v.shape.length).to eq(1)
|
|
210
|
+
|
|
211
|
+
ans = [1.0,4.0,7.0,10.0]
|
|
212
|
+
|
|
213
|
+
expect(v[0]).to be_within(0.000001).of(ans[0])
|
|
214
|
+
expect(v[1]).to be_within(0.000001).of(ans[1])
|
|
215
|
+
expect(v[2]).to be_within(0.000001).of(ans[2])
|
|
216
|
+
expect(v[3]).to be_within(0.000001).of(ans[3])
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it "creates a matrix of input shape with each entry linearly spaced in row major order" do
|
|
220
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
221
|
+
v = NMatrix.linspace(1, Math::PI, [2,2])
|
|
222
|
+
expect(v.dtype).to eq(:float64)
|
|
223
|
+
|
|
224
|
+
ans = [1.0, 1.7138642072677612, 2.4277284145355225, 3.1415927410125732]
|
|
225
|
+
|
|
226
|
+
expect(v[0,0]).to be_within(0.000001).of(ans[0])
|
|
227
|
+
expect(v[0,1]).to be_within(0.000001).of(ans[1])
|
|
228
|
+
expect(v[1,0]).to be_within(0.000001).of(ans[2])
|
|
229
|
+
expect(v[1,1]).to be_within(0.000001).of(ans[3])
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
context "::logspace" do
|
|
234
|
+
it "creates a logarithmically spaced vector" do
|
|
235
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
236
|
+
v = NMatrix.logspace(1, 2, 10)
|
|
237
|
+
|
|
238
|
+
expect(v.shape.length).to eq(1)
|
|
239
|
+
|
|
240
|
+
#Unit test taken from Matlab R2015b output of logspace(1,2,10)
|
|
241
|
+
ans = [10.0000, 12.9155, 16.6810, 21.5443, 27.8256, 35.9381, 46.4159, 59.9484, 77.4264, 100.0000]
|
|
242
|
+
|
|
243
|
+
expect(v[0].round(4)).to be_within(0.000001).of(ans[0])
|
|
244
|
+
expect(v[1].round(4)).to be_within(0.000001).of(ans[1])
|
|
245
|
+
expect(v[2].round(4)).to be_within(0.000001).of(ans[2])
|
|
246
|
+
expect(v[3].round(4)).to be_within(0.000001).of(ans[3])
|
|
247
|
+
expect(v[4].round(4)).to be_within(0.000001).of(ans[4])
|
|
248
|
+
expect(v[5].round(4)).to be_within(0.000001).of(ans[5])
|
|
249
|
+
expect(v[6].round(4)).to be_within(0.000001).of(ans[6])
|
|
250
|
+
expect(v[7].round(4)).to be_within(0.000001).of(ans[7])
|
|
251
|
+
expect(v[8].round(4)).to be_within(0.000001).of(ans[8])
|
|
252
|
+
expect(v[9].round(4)).to be_within(0.000001).of(ans[9])
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
it "creates a logarithmically spaced vector bounded by Math::PI if :pi is pre-supplied" do
|
|
256
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
257
|
+
v = NMatrix.logspace(1, :pi, 7)
|
|
258
|
+
|
|
259
|
+
#Unit test taken from Matlab R2015b output of logspace(1,pi,10)
|
|
260
|
+
ans = [10.0000, 8.2450, 6.7980, 5.6050, 4.6213, 3.8103, 3.1416]
|
|
261
|
+
|
|
262
|
+
expect(v[0].round(4)).to be_within(0.000001).of(ans[0])
|
|
263
|
+
expect(v[1].round(4)).to be_within(0.000001).of(ans[1])
|
|
264
|
+
expect(v[2].round(4)).to be_within(0.000001).of(ans[2])
|
|
265
|
+
expect(v[3].round(4)).to be_within(0.000001).of(ans[3])
|
|
266
|
+
expect(v[4].round(4)).to be_within(0.000001).of(ans[4])
|
|
267
|
+
expect(v[5].round(4)).to be_within(0.000001).of(ans[5])
|
|
268
|
+
expect(v[6].round(4)).to be_within(0.000001).of(ans[6])
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
it "creates a matrix of input shape with each entry logarithmically spaced in row major order" do
|
|
272
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
273
|
+
v = NMatrix.logspace(1, 2, [3,2])
|
|
274
|
+
|
|
275
|
+
ans = [10.0, 15.8489, 25.1189, 39.8107, 63.0957, 100.0]
|
|
276
|
+
|
|
277
|
+
expect(v[0,0].round(4)).to be_within(0.000001).of(ans[0])
|
|
278
|
+
expect(v[0,1].round(4)).to be_within(0.000001).of(ans[1])
|
|
279
|
+
expect(v[1,0].round(4)).to be_within(0.000001).of(ans[2])
|
|
280
|
+
expect(v[1,1].round(4)).to be_within(0.000001).of(ans[3])
|
|
281
|
+
expect(v[2,0].round(4)).to be_within(0.000001).of(ans[4])
|
|
282
|
+
expect(v[2,1].round(4)).to be_within(0.000001).of(ans[5])
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
it "seq() creates a matrix of integers, sequentially" do
|
|
287
|
+
m = NMatrix.seq(2) # 2x2 matrix.
|
|
288
|
+
value = 0
|
|
289
|
+
|
|
290
|
+
2.times do |i|
|
|
291
|
+
2.times do |j|
|
|
292
|
+
expect(m[i,j]).to eq(value)
|
|
293
|
+
value += 1
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
it "indgen() creates a matrix of integers as well as seq()" do
|
|
299
|
+
m = NMatrix.indgen(2) # 2x2 matrix.
|
|
300
|
+
value = 0
|
|
301
|
+
|
|
302
|
+
2.times do |i|
|
|
303
|
+
2.times do |j|
|
|
304
|
+
expect(m[i, j]).to eq(value)
|
|
305
|
+
value += 1
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
it "findgen creates a matrix of floats, sequentially" do
|
|
311
|
+
m = NMatrix.findgen(2) # 2x2 matrix.
|
|
312
|
+
value = 0
|
|
313
|
+
|
|
314
|
+
2.times do |i|
|
|
315
|
+
2.times do |j|
|
|
316
|
+
expect(m[i, j]/10).to be_within(Float::EPSILON).of(value.to_f/10)
|
|
317
|
+
value += 1
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
it "bindgen() creates a matrix of bytes" do
|
|
323
|
+
m = NMatrix.bindgen(2) # 2x2 matrix.
|
|
324
|
+
value = 0
|
|
325
|
+
|
|
326
|
+
2.times do |i|
|
|
327
|
+
2.times do |j|
|
|
328
|
+
expect(m[i, j]).to eq(value)
|
|
329
|
+
value += 1
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
it "cindgen() creates a matrix of complexes" do
|
|
335
|
+
m = NMatrix.cindgen(2) # 2x2 matrix.
|
|
336
|
+
value = 0
|
|
337
|
+
|
|
338
|
+
2.times do |i|
|
|
339
|
+
2.times do |j|
|
|
340
|
+
expect(m[i, j].real).to be_within(Float::EPSILON).of(value)
|
|
341
|
+
expect(m[i, j].imag).to be_within(Float::EPSILON).of(0.0)
|
|
342
|
+
value += 1
|
|
343
|
+
end
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
it "column() returns a NMatrix" do
|
|
348
|
+
m = NMatrix.random(3)
|
|
349
|
+
|
|
350
|
+
expect(m.column(2).is_a?(NMatrix)).to be true
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
it "row() returns a NMatrix" do
|
|
354
|
+
m = NMatrix.random(3)
|
|
355
|
+
|
|
356
|
+
expect(m.row(2).is_a?(NMatrix)).to be true
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
it "diagonals() creates an NMatrix" do
|
|
360
|
+
arr = [1,2,3,4]
|
|
361
|
+
m = NMatrix.diagonals(arr)
|
|
362
|
+
expect(m.is_a?(NMatrix)).to be true
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
it "diagonals() contains the seeded values on the diagonal" do
|
|
366
|
+
arr = [1,2,3,4]
|
|
367
|
+
m = NMatrix.diagonals(arr)
|
|
368
|
+
expect(m[0,0]).to eq(arr[0])
|
|
369
|
+
expect(m[1,1]).to eq(arr[1])
|
|
370
|
+
expect(m[2,2]).to eq(arr[2])
|
|
371
|
+
expect(m[3,3]).to eq(arr[3])
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
context "_like constructors" do
|
|
375
|
+
before :each do
|
|
376
|
+
@nm_1d = NMatrix[5.0,0.0,1.0,2.0,3.0]
|
|
377
|
+
@nm_2d = NMatrix[[0.0,1.0],[2.0,3.0]]
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
it "should create an nmatrix of ones with dimensions and type the same as its argument" do
|
|
381
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
382
|
+
expect(NMatrix.ones_like(@nm_1d)).to eq NMatrix[1.0, 1.0, 1.0, 1.0, 1.0]
|
|
383
|
+
expect(NMatrix.ones_like(@nm_2d)).to eq NMatrix[[1.0, 1.0], [1.0, 1.0]]
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
it "should create an nmatrix of zeros with dimensions and type the same as its argument" do
|
|
387
|
+
expect(NMatrix.zeros_like(@nm_1d)).to eq NMatrix[0.0, 0.0, 0.0, 0.0, 0.0]
|
|
388
|
+
expect(NMatrix.zeros_like(@nm_2d)).to eq NMatrix[[0.0, 0.0], [0.0, 0.0]]
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
describe "NVector" do
|
|
395
|
+
|
|
396
|
+
it "zeros() creates a vector of zeros" do
|
|
397
|
+
v = NVector.zeros(4)
|
|
398
|
+
|
|
399
|
+
4.times do |i|
|
|
400
|
+
expect(v[i]).to eq(0)
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
it "ones() creates a vector of ones" do
|
|
405
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
406
|
+
v = NVector.ones(3)
|
|
407
|
+
|
|
408
|
+
3.times do |i|
|
|
409
|
+
expect(v[i]).to eq(1)
|
|
410
|
+
end
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
it "random() creates a vector of random numbers" do
|
|
414
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
415
|
+
v = NVector.random(4)
|
|
416
|
+
expect(v.dtype).to eq(:float64)
|
|
417
|
+
expect(v.stype).to eq(:dense)
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
it "seq() creates a vector of integers, sequentially" do
|
|
421
|
+
v = NVector.seq(7)
|
|
422
|
+
expect(v).to eq(NMatrix.new([7,1], [0, 1, 2, 3, 4, 5, 6]))
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
it "seq() only accepts integers as dimension" do
|
|
426
|
+
expect { NVector.seq(3) }.to_not raise_error
|
|
427
|
+
|
|
428
|
+
expect { NVector.seq([1, 3]) }.to raise_error
|
|
429
|
+
expect { NVector.seq(:wtf) }.to raise_error
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
it "indgen() creates a vector of integers as well as seq()" do
|
|
433
|
+
v = NVector.indgen(7)
|
|
434
|
+
expect(v).to eq(NMatrix.new([7,1], [0, 1, 2, 3, 4, 5, 6]))
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
it "findgen creates a vector of floats, sequentially" do
|
|
438
|
+
v = NVector.findgen(2)
|
|
439
|
+
expect(v).to eq(NMatrix.new([2,1], [0.0, 1.0]))
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
it "bindgen() creates a vector of bytes, sequentially" do
|
|
443
|
+
v = NVector.bindgen(4)
|
|
444
|
+
expect(v).to eq(NMatrix.new([4,1], [0, 1, 2, 3], dtype: :byte))
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
it "cindgen() creates a vector of complexes, sequentially" do
|
|
448
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
449
|
+
v = NVector.cindgen(2)
|
|
450
|
+
expect(v).to eq(NMatrix.new([2,1], [Complex(0.0, 0.0), Complex(1.0, 0.0)], dtype: :complex64))
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
it "linspace() creates a vector with n values equally spaced between a and b" do
|
|
454
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
455
|
+
v = NVector.linspace(0, 2, 5)
|
|
456
|
+
expect(v).to eq(NMatrix.new([5,1], [0.0, 0.5, 1.0, 1.5, 2.0]))
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
it "logspace() creates a vector with n values logarithmically spaced between decades 10^a and 10^b" do
|
|
460
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
461
|
+
v = NVector.logspace(0, 3, 4)
|
|
462
|
+
expect(v).to eq(NMatrix.new([4,1], [1.0, 10.0, 100.0, 1000.0]))
|
|
463
|
+
end
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
describe "Inline constructor" do
|
|
467
|
+
|
|
468
|
+
it "creates a NMatrix with the given values" do
|
|
469
|
+
m = NMatrix.new([2, 2], [1, 4, 6, 7])
|
|
470
|
+
n = NMatrix[[1, 4], [6, 7]]
|
|
471
|
+
|
|
472
|
+
expect(m).to eq n
|
|
473
|
+
end
|
|
474
|
+
end
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# = NMatrix
|
|
2
|
+
#
|
|
3
|
+
# A linear algebra library for scientific computation in Ruby.
|
|
4
|
+
# NMatrix is part of SciRuby.
|
|
5
|
+
#
|
|
6
|
+
# NMatrix was originally inspired by and derived from NArray, by
|
|
7
|
+
# Masahiro Tanaka: http://narray.rubyforge.org
|
|
8
|
+
#
|
|
9
|
+
# == Copyright Information
|
|
10
|
+
#
|
|
11
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
|
12
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
|
13
|
+
#
|
|
14
|
+
# Please see LICENSE.txt for additional copyright notices.
|
|
15
|
+
#
|
|
16
|
+
# == Contributing
|
|
17
|
+
#
|
|
18
|
+
# By contributing source code to SciRuby, you agree to be bound by
|
|
19
|
+
# our Contributor Agreement:
|
|
20
|
+
#
|
|
21
|
+
# * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
|
|
22
|
+
#
|
|
23
|
+
# == slice_set_spec.rb
|
|
24
|
+
#
|
|
25
|
+
# Test of slice set operations.
|
|
26
|
+
|
|
27
|
+
require 'spec_helper'
|
|
28
|
+
require 'pry'
|
|
29
|
+
|
|
30
|
+
describe "Set slice operation" do
|
|
31
|
+
include RSpec::Longrun::DSL
|
|
32
|
+
|
|
33
|
+
[:dense, :yale, :list].each do |stype|
|
|
34
|
+
context "for #{stype}" do
|
|
35
|
+
before :each do
|
|
36
|
+
@m = create_matrix(stype)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
example "set and unset a range of entries with single values" do
|
|
40
|
+
|
|
41
|
+
if stype == :yale
|
|
42
|
+
step "verify correct arrangement of Yale IJA and A arrays" do
|
|
43
|
+
@m.extend NMatrix::YaleFunctions unless jruby?
|
|
44
|
+
if jruby?
|
|
45
|
+
pending("not yet implemented for NMatrix-JRuby")
|
|
46
|
+
else
|
|
47
|
+
expect(@m.yale_ija).to eq([4,6,8,10,1,2,0,2,0,1])
|
|
48
|
+
end
|
|
49
|
+
expect(@m.yale_a).to eq([0,4,8,0, 1,2,3,5,6,7])
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
step "set and reset a single entry" do
|
|
54
|
+
n = @m.clone
|
|
55
|
+
old_val = @m[0,0]
|
|
56
|
+
@m[0,0] = 100
|
|
57
|
+
expect(@m[0,0]).to eq(100)
|
|
58
|
+
@m[0,0] = old_val
|
|
59
|
+
expect(@m).to eq(n)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
if stype == :yale
|
|
63
|
+
n = @m.clone
|
|
64
|
+
step "set a row of entries" do
|
|
65
|
+
n[0,0..2] = 0
|
|
66
|
+
expect(n[0,0..2].to_flat_array).to eq([0,0,0])
|
|
67
|
+
expect(n[1,0..2].to_flat_array).to eq([3,4,5])
|
|
68
|
+
expect(n[2,0..2].to_flat_array).to eq([6,7,8])
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
step "set a second row of entries" do
|
|
72
|
+
n[2,0..2] = 0
|
|
73
|
+
expect(n[2,0..2].to_flat_array).to eq([0,0,0])
|
|
74
|
+
expect(n[1,0..2].to_flat_array).to eq([3,4,5])
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
step "reset both rows of entries" do
|
|
78
|
+
n[0,0..2] = [0,1,2]
|
|
79
|
+
n[2,0..2] = [6,7,8]
|
|
80
|
+
expect(n).to eq(@m)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
slice_result_a = NMatrix.new(:dense, 2, 100, @m.dtype).cast(stype)
|
|
85
|
+
slice_result_b = NMatrix.new(:dense, 2, 0, @m.dtype).cast(stype)
|
|
86
|
+
m = @m.clone
|
|
87
|
+
|
|
88
|
+
step "set upper left-hand 2x2 corner to 100" do
|
|
89
|
+
m[0..1,0..1] = 100
|
|
90
|
+
|
|
91
|
+
if stype == :yale
|
|
92
|
+
expect(m.yale_ija).to eq([4, 6, 8, 10, 1, 2, 0, 2, 0, 1])
|
|
93
|
+
expect(m.yale_a).to eq([100, 100, 8, 0, 100, 2, 100, 5, 6, 7])
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
expect(m[0..1,0..1]).to eq(slice_result_a)
|
|
97
|
+
expect(m[2,0..1]).to eq(@m[2,0..1])
|
|
98
|
+
expect(m[0..1,2]).to eq(@m[0..1,2])
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
step "set upper left-hand 2x2 corner to 0" do
|
|
102
|
+
m[0..1,0..1] = 0
|
|
103
|
+
if stype == :yale
|
|
104
|
+
expect([4,5,6,8,2,2,0,1]).to eq(m.yale_ija)
|
|
105
|
+
expect([0,0,8,0,2,5,6,7]).to eq(m.yale_a)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
expect(m[0..1,0..1]).to eq(slice_result_b)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
m = @m.clone
|
|
112
|
+
step "set lower left-hand 2x2 corner to 100" do
|
|
113
|
+
m[1..2,0..1] = 100
|
|
114
|
+
expect(m[1..2,0..1]).to eq(slice_result_a)
|
|
115
|
+
expect(m[0,0..1]).to eq(@m[0,0..1])
|
|
116
|
+
expect(m[1..2,2]).to eq(@m[1..2,2])
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
step "set lower left-hand 2x2 corner to 0" do
|
|
120
|
+
m[1..2,0..1] = 0
|
|
121
|
+
expect(m[1..2,0..1]).to eq(slice_result_b)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
m = @m.clone
|
|
125
|
+
step "set lower right-hand 2x2 corner to 100" do
|
|
126
|
+
m[1..2,1..2] = 100
|
|
127
|
+
expect(m[1..2,1..2]).to eq(slice_result_a)
|
|
128
|
+
expect(m[0,1..2]).to eq(@m[0,1..2])
|
|
129
|
+
expect(m[1..2,0]).to eq(@m[1..2,0])
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
step "set lower right-hand 2x2 corner to 0" do
|
|
133
|
+
m[1..2,1..2] = 0
|
|
134
|
+
expect(m[1..2,1..2]).to eq(slice_result_b)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
m = @m.clone
|
|
138
|
+
step "set upper right-hand 2x2 corner to 100" do
|
|
139
|
+
m[0..1,1..2] = 100
|
|
140
|
+
expect(m[0..1,1..2]).to eq(slice_result_a)
|
|
141
|
+
expect(m[2,1..2]).to eq(@m[2,1..2])
|
|
142
|
+
expect(m[0..1,0]).to eq(@m[0..1,0])
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
step "set upper right-hand 2x2 corner to 0" do
|
|
146
|
+
m[0..1,1..2] = 0
|
|
147
|
+
expect(m[0..1,1..2]).to eq(slice_result_b)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
example "set a range of values to a matrix's contents" do
|
|
152
|
+
pending("not yet implemented for int dtype for NMatrix-JRuby") if jruby?
|
|
153
|
+
x = NMatrix.new(4, stype: :yale, dtype: :int16)
|
|
154
|
+
x.extend NMatrix::YaleFunctions if stype == :yale
|
|
155
|
+
x[1..3,1..3] = @m
|
|
156
|
+
expect(x.to_flat_array).to eq([0,0,0,0, 0,0,1,2, 0,3,4,5, 0,6,7,8])
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
end
|