stick 1.2.0
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/CHANGES +7 -0
- data/COPYING +344 -0
- data/README +110 -0
- data/lib/stick/constants.rb +3 -0
- data/lib/stick/constants/cgs.rb +151 -0
- data/lib/stick/constants/mks.rb +158 -0
- data/lib/stick/constants/number.rb +33 -0
- data/lib/stick/constants/typeless_cgs.rb +141 -0
- data/lib/stick/constants/typeless_mks.rb +142 -0
- data/lib/stick/currency.rb +8 -0
- data/lib/stick/mapcar.rb +61 -0
- data/lib/stick/matrix.rb +1022 -0
- data/lib/stick/quaternion.rb +562 -0
- data/lib/stick/times.rb +441 -0
- data/lib/stick/units.rb +112 -0
- data/lib/stick/units/base.rb +980 -0
- data/lib/stick/units/currency.rb +159 -0
- data/lib/stick/units/data/binary/base.rb +4 -0
- data/lib/stick/units/data/cex.rb +5 -0
- data/lib/stick/units/data/currency-default.rb +5 -0
- data/lib/stick/units/data/currency-standard.rb +2 -0
- data/lib/stick/units/data/currency/base.rb +89 -0
- data/lib/stick/units/data/iec.rb +5 -0
- data/lib/stick/units/data/iec_binary/base.rb +6 -0
- data/lib/stick/units/data/si.rb +7 -0
- data/lib/stick/units/data/si/base.rb +9 -0
- data/lib/stick/units/data/si/derived.rb +26 -0
- data/lib/stick/units/data/si/extra.rb +22 -0
- data/lib/stick/units/data/uk.rb +10 -0
- data/lib/stick/units/data/uk/base.rb +22 -0
- data/lib/stick/units/data/units-default.rb +11 -0
- data/lib/stick/units/data/units-standard.rb +5 -0
- data/lib/stick/units/data/us.rb +10 -0
- data/lib/stick/units/data/us/base.rb +23 -0
- data/lib/stick/units/data/xmethods.rb +5 -0
- data/lib/stick/units/data/xmethods/cached.rb +84 -0
- data/lib/stick/units/data/xmethods/mapping.rb +87 -0
- data/lib/stick/units/loaders.rb +98 -0
- data/lib/stick/units/units.rb +109 -0
- data/meta/MANIFEST +76 -0
- data/meta/ROLLRC +2 -0
- data/meta/icli.yaml +16 -0
- data/meta/project.yaml +18 -0
- data/task/clobber/package +10 -0
- data/task/publish +57 -0
- data/task/release +10 -0
- data/task/setup +1616 -0
- data/task/test +25 -0
- data/test/spec_matrix.rb +342 -0
- data/test/test_currency.rb +26 -0
- data/test/test_matrix.rb +359 -0
- data/test/test_units.rb +205 -0
- data/work/TODO +20 -0
- data/work/bytes.rb +231 -0
- data/work/multipliers.rb +195 -0
- metadata +138 -0
data/task/test
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ratch
|
2
|
+
|
3
|
+
# Run unit tests
|
4
|
+
|
5
|
+
live = ARGV.delete('--live')
|
6
|
+
|
7
|
+
unless live
|
8
|
+
$LOAD_PATH.unshift(File.expand_path('lib'))
|
9
|
+
end
|
10
|
+
|
11
|
+
main :test do
|
12
|
+
if find = argv[0]
|
13
|
+
unless file?(find)
|
14
|
+
find = File.join(find, '**', 'test_*.rb')
|
15
|
+
end
|
16
|
+
else
|
17
|
+
find = 'test/**/test_*.rb'
|
18
|
+
end
|
19
|
+
|
20
|
+
Dir.glob(find).each do |file|
|
21
|
+
next if dir?(file)
|
22
|
+
load file
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
data/test/spec_matrix.rb
ADDED
@@ -0,0 +1,342 @@
|
|
1
|
+
require 'stick/matrix'
|
2
|
+
|
3
|
+
describe "Vector class extension:" do
|
4
|
+
setup do
|
5
|
+
@v = Vector.[](1, 2, 3, 4)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "[] method" do
|
9
|
+
v = @v.clone
|
10
|
+
v[1..2] = Vector[9, 9, 9, 9, 9]
|
11
|
+
v.should == Vector[1, 9, 9, 4]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "Vector.concat method" do
|
15
|
+
Vector.concat(Vector[1], Vector[2, 3]).should == Vector[1, 2, 3]
|
16
|
+
Vector.concat(Vector[1], Vector[2, 3], Vector[4, 5]).should == Vector[1, 2, 3, 4, 5]
|
17
|
+
end
|
18
|
+
|
19
|
+
it "collect method" do
|
20
|
+
@v.collect!{|i| i * i}.should == Vector.[](1, 4, 9, 16)
|
21
|
+
@v.collect!{|i| 3 * i}.should == Vector.[](3, 12, 27, 48)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "each method" do
|
25
|
+
r = []
|
26
|
+
@v.each{|i| r << i+1}
|
27
|
+
r.should == [2, 3, 4, 5]
|
28
|
+
end
|
29
|
+
|
30
|
+
it "max element" do
|
31
|
+
@v.max.should == 4
|
32
|
+
end
|
33
|
+
|
34
|
+
it "max element" do
|
35
|
+
@v.min.should == 1
|
36
|
+
end
|
37
|
+
|
38
|
+
it "norm method" do
|
39
|
+
v = Vector.[](3, 4)
|
40
|
+
v.norm.should == 5
|
41
|
+
end
|
42
|
+
|
43
|
+
it "method p_norm(1)" do
|
44
|
+
v = Vector.[](3, 4)
|
45
|
+
v.norm(1).should == 7
|
46
|
+
end
|
47
|
+
|
48
|
+
it "method p_norm(2)" do
|
49
|
+
v = Vector.[](3, 4)
|
50
|
+
v.norm(2).should == 5
|
51
|
+
end
|
52
|
+
|
53
|
+
it "method p_norm(3)" do
|
54
|
+
v = Vector.[](3, 4)
|
55
|
+
v.norm(3).should > 4.49
|
56
|
+
v.norm(3).should < 4.50
|
57
|
+
end
|
58
|
+
|
59
|
+
it "method p_norm(4)" do
|
60
|
+
v = Vector.[](3, 4)
|
61
|
+
v.norm(4).should > 4.28
|
62
|
+
v.norm(4).should < 4.29
|
63
|
+
end
|
64
|
+
|
65
|
+
it "[]= method" do
|
66
|
+
@v[3] = 10
|
67
|
+
@v.should == Vector.[](1, 2, 3, 10)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "norm_inf" do
|
71
|
+
@v.norm_inf.should == 4
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "Matrix class extension:" do
|
76
|
+
setup do
|
77
|
+
@m = Matrix[[1, 2, 222], [2, 33, 4]]
|
78
|
+
end
|
79
|
+
|
80
|
+
it "[] method" do
|
81
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j}
|
82
|
+
m[1, 2].should == 5
|
83
|
+
m[3, 1..2].should == Vector[10, 11]
|
84
|
+
m[0..1, 0..2].should == Matrix[[0, 1, 2], [3, 4, 5]]
|
85
|
+
end
|
86
|
+
|
87
|
+
it "[]= method" do
|
88
|
+
m = Matrix.new(3, 3){|i, j| i * 3 + j}
|
89
|
+
m[1, 2] = 9
|
90
|
+
m.should == Matrix[[0, 1, 2], [3, 4, 9], [6, 7, 8]]
|
91
|
+
m[1, 1..2] = Vector[8, 8]
|
92
|
+
m.should == Matrix[[0, 1, 2], [3, 8, 8], [6, 7, 8]]
|
93
|
+
m[0..1, 0..1] = Matrix[[0, 0, 0], [0, 0, 0]]
|
94
|
+
m.should == Matrix[[0, 0, 2], [0, 0, 8], [6, 7, 8]]
|
95
|
+
end
|
96
|
+
|
97
|
+
it "set method" do
|
98
|
+
n = Matrix.new(2, 3)
|
99
|
+
n.set(@m)
|
100
|
+
n.should == @m
|
101
|
+
end
|
102
|
+
|
103
|
+
it "set method and wrap value" do
|
104
|
+
@m.wrap = :torus
|
105
|
+
n = Matrix.new(2, 3)
|
106
|
+
n.set(@m)
|
107
|
+
n.wrap.should == :torus
|
108
|
+
end
|
109
|
+
|
110
|
+
it "wrap method" do
|
111
|
+
@m.wrap=:torus
|
112
|
+
@m[2, 3].should == 1
|
113
|
+
@m.wrap=:h_cylinder
|
114
|
+
@m[2, 0].should == 1
|
115
|
+
@m.wrap=:v_cylinder
|
116
|
+
@m[0, 3].should == 1
|
117
|
+
end
|
118
|
+
|
119
|
+
it "maximum length of a column" do
|
120
|
+
@m.max_len_column(1).should == 2
|
121
|
+
end
|
122
|
+
|
123
|
+
it "list of maximum lengths of columns" do
|
124
|
+
@m.cols_len.should == [1, 2, 3]
|
125
|
+
end
|
126
|
+
|
127
|
+
it "matrix each method" do
|
128
|
+
r = []
|
129
|
+
@m.each{|x| r << x + 3}
|
130
|
+
r.should == [4, 5, 225, 5, 36, 7]
|
131
|
+
|
132
|
+
s = 0
|
133
|
+
@m.each{|x| s += x}
|
134
|
+
s.should == 264
|
135
|
+
end
|
136
|
+
|
137
|
+
it "row! method" do
|
138
|
+
@m.row!(0){|x| x+x}.should == [2, 4, 444]
|
139
|
+
@m.should == Matrix[[2, 4, 444], [2, 33, 4]]
|
140
|
+
end
|
141
|
+
|
142
|
+
it "row_collect method" do
|
143
|
+
@m.row_collect(1){|x| x+10}.should == [12, 43, 14]
|
144
|
+
end
|
145
|
+
|
146
|
+
it "column_collect method" do
|
147
|
+
@m.column_collect(0){|x| x*3}.should == [3, 6]
|
148
|
+
end
|
149
|
+
|
150
|
+
it "row_collect! method, identicaly with row!" do
|
151
|
+
@m.row_collect!(0){|x| x+x}.should == [2, 4, 444]
|
152
|
+
@m.should == Matrix[[2, 4, 444], [2, 33, 4]]
|
153
|
+
end
|
154
|
+
|
155
|
+
it "column_collect! method" do
|
156
|
+
@m.column_collect!(2){|x| x+10}.should == [232, 14]
|
157
|
+
@m.should == Matrix[[1, 2, 232], [2, 33, 14]]
|
158
|
+
end
|
159
|
+
|
160
|
+
it "column= " do
|
161
|
+
m = Matrix.new(3, 3){|i, j| i * 3 + j + 1}
|
162
|
+
m.column= 1, Vector[1,1,1,1,1,1]
|
163
|
+
m.should == Matrix[[1, 1, 3],[4, 1, 6],[7, 1, 9]]
|
164
|
+
m.column= 2, Vector[9,9], 0..1
|
165
|
+
m.should == Matrix[[1, 1, 9],[4, 1, 9],[7, 1, 9]]
|
166
|
+
end
|
167
|
+
|
168
|
+
it "row= " do
|
169
|
+
m = Matrix.new(3, 3){|i, j| i * 3 + j + 1}
|
170
|
+
m.row= 1, Vector[1,1,1,1,1,1]
|
171
|
+
m.should == Matrix[[1, 2, 3],[1, 1, 1],[7, 8, 9]]
|
172
|
+
m.row= 2, Vector[9,9], 0..2
|
173
|
+
m.should == Matrix[[1, 2, 3],[1, 1, 1],[9, 9, 0]]
|
174
|
+
end
|
175
|
+
|
176
|
+
it "norm of a matrix" do
|
177
|
+
m = Matrix[[1, 2, 3], [1, 2, 3]]
|
178
|
+
m.norm.should == Math.sqrt(28)
|
179
|
+
end
|
180
|
+
|
181
|
+
it "test empty matrix" do
|
182
|
+
@m.empty?.should == false
|
183
|
+
n = Matrix[]
|
184
|
+
n.empty?.should == true
|
185
|
+
end
|
186
|
+
|
187
|
+
it "row2matrix" do
|
188
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j + 1}
|
189
|
+
m.row2matrix(1..2).should == Matrix[[4, 5, 6],[7, 8, 9]]
|
190
|
+
m.row2matrix(2).should == Matrix[[7, 8, 9]]
|
191
|
+
m.row2matrix(0..4).should == m
|
192
|
+
end
|
193
|
+
|
194
|
+
it "column2matrix" do
|
195
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j + 1}
|
196
|
+
m.column2matrix(1).should == Matrix[[2], [5], [8], [11]]
|
197
|
+
end
|
198
|
+
|
199
|
+
it "diag" do
|
200
|
+
m1 = Matrix[[1]]
|
201
|
+
m2 = Matrix[[2, 0], [0, 3]]
|
202
|
+
m3 = Matrix[[4, 0, 0], [0, 5, 0], [0, 0, 6]]
|
203
|
+
a1 = Matrix.new(6, 6){|i, j| i == j ? i + 1: 0}
|
204
|
+
Matrix.diag(m1, m2, m3).should == a1
|
205
|
+
Matrix.diag(m2).should == m2
|
206
|
+
a2 = Matrix[[2, 0, 0, 0],
|
207
|
+
[0, 3, 0, 0],
|
208
|
+
[0, 0, 2, 0],
|
209
|
+
[0, 0, 0, 3]]
|
210
|
+
Matrix.diag(m2, m2).should == a2
|
211
|
+
end
|
212
|
+
|
213
|
+
it "equal_in_delta" do
|
214
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j +1}
|
215
|
+
Matrix.equal_in_delta?(m, m).should == true
|
216
|
+
mm = m.clone
|
217
|
+
mm[0,0] += 2
|
218
|
+
Matrix.equal_in_delta?(m, mm, 0.001).should == false
|
219
|
+
Matrix.equal_in_delta?(m, mm, 2).should == true
|
220
|
+
end
|
221
|
+
|
222
|
+
it "diag_in_delta" do
|
223
|
+
Matrix.diag_in_delta?(Matrix.I(5), Matrix.new(4, 4){|i, j| i + j}).should == false
|
224
|
+
m = Matrix.new(5, 5){|i, j| i == j ? 1 + 0.001 * (i+1) : i + j}
|
225
|
+
Matrix.diag_in_delta?(Matrix.I(5), m, 0.01).should == true
|
226
|
+
end
|
227
|
+
|
228
|
+
it "LU " do
|
229
|
+
m = Matrix[[1, 4, 7],
|
230
|
+
[2, 5, 8],
|
231
|
+
[3, 6, 10]]
|
232
|
+
l = Matrix[[1, 0, 0],[2, 1, 0],[3, 2, 1]]
|
233
|
+
m.L.should == l
|
234
|
+
u = Matrix[[1, 4, 7],[0, -3, -6],[0, 0, 1]]
|
235
|
+
m.U.should == u
|
236
|
+
end
|
237
|
+
|
238
|
+
it "L " do
|
239
|
+
# e.g.: MC, Golub, 3.2 LU factorization, pg 94
|
240
|
+
m = Matrix[[3, 5],
|
241
|
+
[6, 7]]
|
242
|
+
l = Matrix[[1, 0],
|
243
|
+
[2, 1]]
|
244
|
+
m.L.should == l
|
245
|
+
end
|
246
|
+
|
247
|
+
it "U " do
|
248
|
+
# e.g.: MC, Golub, 3.2 LU factorization, pg 94
|
249
|
+
m = Matrix[[3, 5],
|
250
|
+
[6, 7]]
|
251
|
+
u = Matrix[[3, 5],
|
252
|
+
[0, -3]]
|
253
|
+
m.U.should == u
|
254
|
+
end
|
255
|
+
|
256
|
+
it "houseQR " do
|
257
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j +1}
|
258
|
+
Matrix.equal_in_delta?(m, m.houseQ * m.houseR).should == true
|
259
|
+
q = Matrix[[0.0776, 0.8330, 0.5329, 0.1264],
|
260
|
+
[0.3104, 0.4512, -0.8048, 0.2286],
|
261
|
+
[0.5433, 0.0694, 0.0108, -0.8365],
|
262
|
+
[0.7761, -0.3123, 0.2610, 0.4815]]
|
263
|
+
Matrix.equal_in_delta?(m.houseQ, q, 0.0001).should == true
|
264
|
+
end
|
265
|
+
|
266
|
+
it "houseR " do
|
267
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j +1}
|
268
|
+
r = Matrix[[12.88409, 14.59162, 16.29916],
|
269
|
+
[ 0, 1.04131, 2.082630],
|
270
|
+
[ 0, 0, 0],
|
271
|
+
[ 0, 0, 0]]
|
272
|
+
Matrix.equal_in_delta?(r, m.houseR, 1.0e-5).should == true
|
273
|
+
end
|
274
|
+
|
275
|
+
it "bidiagonalization" do
|
276
|
+
# MC, Golub, p252, Example 5.4.2
|
277
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j +1}
|
278
|
+
bidiag = Matrix[[12.884, 21.876, 0 ],
|
279
|
+
[0, 2.246, -0.613],
|
280
|
+
[0, 0, 0 ],
|
281
|
+
[0, 0, 0 ]]
|
282
|
+
Matrix.equal_in_delta?(bidiag, m.bidiagonal, 0.001).should == true
|
283
|
+
end
|
284
|
+
|
285
|
+
it "gram_schmidt" do
|
286
|
+
m = Matrix[[1, 1],
|
287
|
+
[0.001, 0],
|
288
|
+
[0, 0.001]]
|
289
|
+
gsQ = Matrix[[ 1, 0],
|
290
|
+
[0.001, -0.707107],
|
291
|
+
[ 0, 0.707100]]
|
292
|
+
Matrix.equal_in_delta?(gsQ, m.gram_schmidt[0], 0.001).should == true
|
293
|
+
Matrix.equal_in_delta?(m,m.gram_schmidt[0] * m.gram_schmidt[1], 1.0e-5).should == true
|
294
|
+
end
|
295
|
+
|
296
|
+
it "givens " do
|
297
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j +1}
|
298
|
+
Matrix.equal_in_delta?(m, m.givensQ * m.givensR, 0.001).should == true
|
299
|
+
end
|
300
|
+
|
301
|
+
it "hessenbergQR " do
|
302
|
+
hess = Matrix[[1, 2, 1, 2, 1],
|
303
|
+
[1, 3, 2, 3, 4],
|
304
|
+
[0, 2, 4, 3, 5],
|
305
|
+
[0, 0, 1, 4, 3],
|
306
|
+
[0, 0, 0, 6, 1]]
|
307
|
+
hessR = hess.hessenbergR
|
308
|
+
r = Matrix[[1.41421, 3.53553, 2.12132, 3.53553, 3.53553],
|
309
|
+
[ 0, -2.12132, -4.00693, -3.06412, -5.42115],
|
310
|
+
[ 0, 0, -1.20185, -3.51310, -2.31125],
|
311
|
+
[ 0, 0, 0, -6.30628, -1.54912],
|
312
|
+
[ 0, 0, 0, 0, 1.53929]]
|
313
|
+
|
314
|
+
Matrix.equal_in_delta?(r, hessR, 1.0e-5).should == true
|
315
|
+
Matrix.equal_in_delta?(hessR, hess.hessenbergQ.t * hess, 1.0e-5).should == true
|
316
|
+
end
|
317
|
+
|
318
|
+
it "hessenberg_form " do
|
319
|
+
m = Matrix[[1, 5, 7],[3, 0, 6],[4, 3, 1]]
|
320
|
+
h = Matrix[[1, 8.6, -0.2],[5, 4.96, -0.72],[0, 2.28, -3.96]]
|
321
|
+
Matrix.equal_in_delta?(h, m.hessenberg_form_H, 0.001).should == true
|
322
|
+
end
|
323
|
+
|
324
|
+
it "realSchur" do
|
325
|
+
m = Matrix.new(3, 3){1} + Matrix.diagonal(2, 2, 2)
|
326
|
+
e = Matrix[[5, 0, 0],[0, 2, 0],[0, 0, 2]]
|
327
|
+
Matrix.diag_in_delta?(m.realSchur, e, 1.0e-5).should == true
|
328
|
+
end
|
329
|
+
|
330
|
+
it "Classic Jacobi algorithm" do
|
331
|
+
m = Matrix[[3, 1, 1],[1, 3, 1],[1, 1, 3]]
|
332
|
+
v = Matrix[[2, 0, 0],[0, 5, 0],[0, 0, 2]]
|
333
|
+
Matrix.diag_in_delta?(v, m.cJacobiA, 0.01).should == true
|
334
|
+
a = Matrix[[1, 1, 1, 4],
|
335
|
+
[1, 1, 0, 5],
|
336
|
+
[1, 0, 1, 4],
|
337
|
+
[4, 5, 4, 1]]
|
338
|
+
e = Matrix[[-0.26828, 0, 0, 0], [0, -5.97550, 0, 0], [0, 0, 1.01373, 0], [0, 0, 0, 9.23004]]
|
339
|
+
Matrix.diag_in_delta?(e, a.cJacobiA, 1.0e-5).should == true
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + '../lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'stick/currency'
|
5
|
+
|
6
|
+
class TestUnits < Test::Unit::TestCase
|
7
|
+
|
8
|
+
include ::Stick
|
9
|
+
|
10
|
+
def test_typerror
|
11
|
+
assert_raises(TypeError) do
|
12
|
+
assert_equal(1.usd, 1.try.to(:usd))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_cex
|
17
|
+
e = 1.twd().unit
|
18
|
+
r = 1.usd(:cex).to(twd(:cex))
|
19
|
+
assert_equal( e, r.unit )
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_usd_to_tws
|
23
|
+
assert_equal( 1.tws, 1.usd.to(tws) )
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/test/test_matrix.rb
ADDED
@@ -0,0 +1,359 @@
|
|
1
|
+
#>ruby tests/test_xmatrix.rb
|
2
|
+
|
3
|
+
require 'test/unit' unless defined? $ZENTEST and $ZENTEST
|
4
|
+
require 'stick/matrix'
|
5
|
+
|
6
|
+
class TestVector < Test::Unit::TestCase
|
7
|
+
@@v = Vector.[](1, 2, 3, 4)
|
8
|
+
|
9
|
+
def test_setvalue
|
10
|
+
v = @@v.clone
|
11
|
+
v[1..2] = Vector[9, 9, 9, 9, 9]
|
12
|
+
assert_equal Vector[1, 9, 9, 4], v
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_concat
|
16
|
+
assert_equal Vector[1, 2, 3], Vector.concat(Vector[1], Vector[2, 3])
|
17
|
+
assert_equal Vector[1, 2, 3, 4, 5], Vector.concat(Vector[1], Vector[2, 3], Vector[4, 5])
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_collect
|
21
|
+
v = @@v.clone
|
22
|
+
assert_equal Vector.[](1, 4, 9, 16), v.collect!{|i| i * i}
|
23
|
+
assert_equal Vector.[](3, 12, 27, 48), v.collect!{|i| 3 * i}
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_each
|
27
|
+
r = []
|
28
|
+
@@v.each{|i| r << i+1}
|
29
|
+
assert_equal [2, 3, 4, 5], r
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_max
|
33
|
+
assert_equal 4, @@v.max
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_min
|
37
|
+
assert_equal 1, @@v.min
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_norm
|
41
|
+
v = Vector[3, 4]
|
42
|
+
assert_equal 5, v.norm
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_p_norm1
|
46
|
+
v = Vector.[](3, 4)
|
47
|
+
assert_equal 7, v.norm(1)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_p_norm2
|
51
|
+
v = Vector.[](3, 4)
|
52
|
+
assert_equal 5, v.norm(2)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_p_norm3
|
56
|
+
v = Vector.[](3, 4)
|
57
|
+
assert_in_delta 4.497941, v.norm(3), 1.0e-5
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_p_norm4
|
61
|
+
v = Vector.[](3, 4)
|
62
|
+
assert_in_delta 4.284572, v.norm(4), 1.0e-5
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_setValue # []=
|
66
|
+
v = @@v.clone
|
67
|
+
v[3] = 10
|
68
|
+
assert_equal Vector.[](1, 2, 3, 10), v
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_norm_inf
|
72
|
+
assert_equal 4, @@v.norm_inf
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class TestMatrix < Test::Unit::TestCase
|
77
|
+
|
78
|
+
def test_id
|
79
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j}
|
80
|
+
assert_equal 5, m[1, 2]
|
81
|
+
assert_equal Vector[10, 11], m[3, 1..2]
|
82
|
+
assert_equal Matrix[[0, 1, 2], [3, 4, 5]], m[0..1, 0..2]
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_id=
|
86
|
+
m = Matrix.new(3, 3){|i, j| i * 3 + j}
|
87
|
+
m[1, 2] = 9
|
88
|
+
assert_equal Matrix[[0, 1, 2], [3, 4, 9], [6, 7, 8]], m
|
89
|
+
m[1, 1..2] = Vector[8, 8]
|
90
|
+
assert_equal Matrix[[0, 1, 2], [3, 8, 8], [6, 7, 8]], m
|
91
|
+
m[0..1, 0..1] = Matrix[[0, 0, 0], [0, 0, 0]]
|
92
|
+
assert_equal Matrix[[0, 0, 2], [0, 0, 8], [6, 7, 8]], m
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_set
|
96
|
+
m = Matrix[[1, 2, 222], [2, 33, 4]]
|
97
|
+
n = Matrix.new(2,3)
|
98
|
+
n.set(m)
|
99
|
+
assert_equal m, n
|
100
|
+
m.wrap = :torus
|
101
|
+
n.set(m)
|
102
|
+
assert_equal :torus, n.wrap
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_wrap
|
106
|
+
m = Matrix[[1, 2, 3], [4, 5, 6]]
|
107
|
+
m.wrap=:torus
|
108
|
+
assert_equal 1, m[2, 3]
|
109
|
+
m.wrap=:h_cylinder
|
110
|
+
assert_equal 1, m[2, 0]
|
111
|
+
m.wrap=:v_cylinder
|
112
|
+
assert_equal 1, m[0, 3]
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_max_len_column
|
116
|
+
m = Matrix[[1, 22, 3], [4, 5, 666666]]
|
117
|
+
assert_equal 6, m.max_len_column(2)
|
118
|
+
end
|
119
|
+
|
120
|
+
#list of maximum lengths of columns
|
121
|
+
def test_cols_len
|
122
|
+
m = Matrix[[1, 2, 222], [2, 33, 4]]
|
123
|
+
assert_equal [1, 2, 3], m.cols_len
|
124
|
+
m = Matrix[[1, 12345, 222], [2, 3, 4]]
|
125
|
+
assert_equal [1, 5, 3], m.cols_len
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_each
|
129
|
+
m = Matrix[[1, 2, 3], [4, 5, 6]]
|
130
|
+
r = []
|
131
|
+
m.each{|x| r << x + 3}
|
132
|
+
assert_equal [4, 5, 6, 7, 8, 9], r
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_row!
|
136
|
+
m = Matrix[[1, 2, 1], [2, 1, 2]]
|
137
|
+
assert_equal [1, 4, 1], m.row!(0) {|x| x*x}
|
138
|
+
m = Matrix[[1, 2, 1], [2, 1, 2]]
|
139
|
+
assert_equal Vector[1, 2, 1], m.row!(0)
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_row_collect
|
143
|
+
m = Matrix[[1, 2, 1], [2, 1, 2]]
|
144
|
+
assert_equal [4, 1, 4], m.row_collect(1){|x| x*x}
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_column_collect
|
148
|
+
m = Matrix[[1, 2, 3], [4, 5, 6]]
|
149
|
+
assert_equal [7, 10], m.column_collect(1){|x| x+5}
|
150
|
+
m = Matrix[[1, 2, 222], [2, 3, 4]]
|
151
|
+
assert_equal [1, 4], m.column_collect(0){|x| x*x}
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_row_collect!
|
155
|
+
m = Matrix[[1, 2, 3], [4, 5, 6]]
|
156
|
+
m.row_collect!(1){|x| x*2}
|
157
|
+
assert_equal Matrix[[1, 2, 3], [8, 10, 12]], m
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_column_collect!
|
161
|
+
m = Matrix[[1, 2, 3], [4, 5, 6]]
|
162
|
+
m.column_collect!(1){|x| x*2}
|
163
|
+
assert_equal Matrix[[1, 4, 3], [4, 10, 6]], m
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_column=
|
167
|
+
m = Matrix.new(3, 3){|i, j| i * 3 + j + 1}
|
168
|
+
m.column= 1, Vector[1,1,1,1,1,1]
|
169
|
+
assert_equal Matrix[[1, 1, 3],[4, 1, 6],[7, 1, 9]], m
|
170
|
+
m.column= 2, Vector[9,9], 0..1
|
171
|
+
assert_equal Matrix[[1, 1, 9],[4, 1, 9],[7, 1, 9]], m
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_row=
|
175
|
+
m = Matrix.new(3, 3){|i, j| i * 3 + j + 1}
|
176
|
+
m.row= 1, Vector[1,1,1,1,1,1]
|
177
|
+
assert_equal Matrix[[1, 2, 3],[1, 1, 1],[7, 8, 9]], m
|
178
|
+
m.row= 2, Vector[9,9], 0..2
|
179
|
+
assert_equal Matrix[[1, 2, 3],[1, 1, 1],[9, 9, 0]], m
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_norm
|
183
|
+
m = Matrix[[1, 2, 1], [2, 1, 2]]
|
184
|
+
assert_equal Math.sqrt(15), m.norm
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_empty
|
188
|
+
m = Matrix[[1, 2, 3], [4, 5, 6]]
|
189
|
+
assert_equal false, m.empty?
|
190
|
+
m = Matrix[]
|
191
|
+
assert_equal true, m.empty?
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_row2matrix
|
195
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j + 1}
|
196
|
+
assert_equal Matrix[[4, 5, 6],[7, 8, 9]], m.row2matrix(1..2)
|
197
|
+
assert_equal Matrix[[7, 8, 9]], m.row2matrix(2)
|
198
|
+
assert_equal m, m.row2matrix(0..4)
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_column2matrix
|
202
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j + 1}
|
203
|
+
assert_equal Matrix[[2], [5], [8], [11]], m.column2matrix(1)
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_diag
|
207
|
+
m1 = Matrix[[1]]
|
208
|
+
m2 = Matrix[[2, 0], [0, 3]]
|
209
|
+
m3 = Matrix[[4, 0, 0], [0, 5, 0], [0, 0, 6]]
|
210
|
+
a1 = Matrix.new(6, 6){|i, j| i == j ? i + 1: 0}
|
211
|
+
assert_equal a1, Matrix.diag(m1, m2, m3)
|
212
|
+
assert_equal m2, Matrix.diag(m2)
|
213
|
+
a2 = Matrix[[2, 0, 0, 0],
|
214
|
+
[0, 3, 0, 0],
|
215
|
+
[0, 0, 2, 0],
|
216
|
+
[0, 0, 0, 3]]
|
217
|
+
assert_equal a2, Matrix.diag(m2, m2)
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_equal_in_delta
|
221
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j +1}
|
222
|
+
assert_equal true, Matrix.equal_in_delta?(m, m)
|
223
|
+
mm = m.clone
|
224
|
+
mm[0,0] += 2
|
225
|
+
assert_equal false, Matrix.equal_in_delta?(m, mm, 0.001)
|
226
|
+
assert_equal true, Matrix.equal_in_delta?(m, mm, 2)
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_diag_in_delta
|
230
|
+
assert_equal false, Matrix.diag_in_delta?(Matrix.I(5), Matrix.new(4, 4){|i, j| i + j})
|
231
|
+
m = Matrix.new(5, 5){|i, j| i == j ? 1 + 0.001 * (i+1) : i + j}
|
232
|
+
assert_equal true, Matrix.diag_in_delta?(Matrix.I(5), m, 0.01)
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_LU
|
236
|
+
m = Matrix[[1, 4, 7],
|
237
|
+
[2, 5, 8],
|
238
|
+
[3, 6, 10]]
|
239
|
+
l = Matrix[[1, 0, 0],[2, 1, 0],[3, 2, 1]]
|
240
|
+
assert_equal l, m.L
|
241
|
+
u = Matrix[[1, 4, 7],[0, -3, -6],[0, 0, 1]]
|
242
|
+
assert_equal u, m.U
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_L
|
246
|
+
# e.g.: MC, Golub, 3.2 LU factorization, pg 94
|
247
|
+
m = Matrix[[3, 5],
|
248
|
+
[6, 7]]
|
249
|
+
l = Matrix[[1, 0],
|
250
|
+
[2, 1]]
|
251
|
+
assert_equal l, m.L
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_U
|
255
|
+
# e.g.: MC, Golub, 3.2 LU factorization, pg 94
|
256
|
+
m = Matrix[[3, 5],
|
257
|
+
[6, 7]]
|
258
|
+
u = Matrix[[3, 5],
|
259
|
+
[0, -3]]
|
260
|
+
assert_equal u, m.U
|
261
|
+
|
262
|
+
end
|
263
|
+
|
264
|
+
def test_houseQR
|
265
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j +1}
|
266
|
+
assert_equal true, Matrix.equal_in_delta?(m, m.houseQ * m.houseR)
|
267
|
+
q = Matrix[[0.0776, 0.8330, 0.5329, 0.1264],
|
268
|
+
[0.3104, 0.4512, -0.8048, 0.2286],
|
269
|
+
[0.5433, 0.0694, 0.0108, -0.8365],
|
270
|
+
[0.7761, -0.3123, 0.2610, 0.4815]]
|
271
|
+
assert_equal true, Matrix.equal_in_delta?(m.houseQ, q, 0.0001)
|
272
|
+
end
|
273
|
+
|
274
|
+
def test_houseR
|
275
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j +1}
|
276
|
+
r = Matrix[[12.88409, 14.59162, 16.29916],
|
277
|
+
[ 0, 1.04131, 2.082630],
|
278
|
+
[ 0, 0, 0],
|
279
|
+
[ 0, 0, 0]]
|
280
|
+
assert_equal true, Matrix.equal_in_delta?(r, m.houseR, 1.0e-5)
|
281
|
+
end
|
282
|
+
|
283
|
+
def test_bidiagonalization # MC, Golub, p252, Example 5.4.2
|
284
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j +1}
|
285
|
+
bidiag = Matrix[[12.884, 21.876, 0 ],
|
286
|
+
[0, 2.246, -0.613],
|
287
|
+
[0, 0, 0 ],
|
288
|
+
[0, 0, 0 ]]
|
289
|
+
assert_equal true, Matrix.equal_in_delta?(bidiag, m.bidiagonal, 0.001)
|
290
|
+
end
|
291
|
+
|
292
|
+
def test_gram_schmidt
|
293
|
+
m = Matrix[[1, 1],
|
294
|
+
[0.001, 0],
|
295
|
+
[0, 0.001]]
|
296
|
+
gsQ = Matrix[[ 1, 0],
|
297
|
+
[0.001, -0.707107],
|
298
|
+
[ 0, 0.707100]]
|
299
|
+
assert_equal true, Matrix.equal_in_delta?(gsQ, m.gram_schmidt[0], 0.001)
|
300
|
+
assert_equal true, Matrix.equal_in_delta?(m,m.gram_schmidt[0] * m.gram_schmidt[1], 1.0e-5)
|
301
|
+
end
|
302
|
+
|
303
|
+
def test_givens
|
304
|
+
m = Matrix.new(4, 3){|i, j| i * 3 + j +1}
|
305
|
+
assert_equal true, Matrix.equal_in_delta?(m, m.givensQ * m.givensR, 0.001)
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_hessenbergQR
|
309
|
+
hess = Matrix[[1, 2, 1, 2, 1],
|
310
|
+
[1, 3, 2, 3, 4],
|
311
|
+
[0, 2, 4, 3, 5],
|
312
|
+
[0, 0, 1, 4, 3],
|
313
|
+
[0, 0, 0, 6, 1]]
|
314
|
+
hessR = hess.hessenbergR
|
315
|
+
r = Matrix[[1.41421, 3.53553, 2.12132, 3.53553, 3.53553],
|
316
|
+
[ 0, -2.12132, -4.00693, -3.06412, -5.42115],
|
317
|
+
[ 0, 0, -1.20185, -3.51310, -2.31125],
|
318
|
+
[ 0, 0, 0, -6.30628, -1.54912],
|
319
|
+
[ 0, 0, 0, 0, 1.53929]]
|
320
|
+
|
321
|
+
assert_equal true, Matrix.equal_in_delta?(r, hessR, 1.0e-5)
|
322
|
+
assert_equal true, Matrix.equal_in_delta?(hessR, hess.hessenbergQ.t * hess, 1.0e-5)
|
323
|
+
end
|
324
|
+
|
325
|
+
def test_hessenberg_form
|
326
|
+
m = Matrix[[1, 5, 7],[3, 0, 6],[4, 3, 1]]
|
327
|
+
h = Matrix[[1, 8.6, -0.2],[5, 4.96, -0.72],[0, 2.28, -3.96]]
|
328
|
+
assert_equal true, Matrix.equal_in_delta?(h, m.hessenberg_form_H, 0.001)
|
329
|
+
end
|
330
|
+
|
331
|
+
def test_realSchur
|
332
|
+
m = Matrix.new(3, 3){1} + Matrix.diagonal(2, 2, 2)
|
333
|
+
e = Matrix[[5, 0, 0],[0, 2, 0],[0, 0, 2]]
|
334
|
+
assert_equal true, Matrix.diag_in_delta?(m.realSchur, e, 1.0e-5)
|
335
|
+
end
|
336
|
+
|
337
|
+
def test_cJacobi
|
338
|
+
m = Matrix[[3, 1, 1],[1, 3, 1],[1, 1, 3]]
|
339
|
+
v = Matrix[[2, 0, 0],[0, 5, 0],[0, 0, 2]]
|
340
|
+
assert_equal true, Matrix.diag_in_delta?(v, m.cJacobiA, 0.01)
|
341
|
+
a = Matrix[[1, 1, 1, 4],
|
342
|
+
[1, 1, 0, 5],
|
343
|
+
[1, 0, 1, 4],
|
344
|
+
[4, 5, 4, 1]]
|
345
|
+
e = Matrix[[-0.26828, 0, 0, 0], [0, -5.97550, 0, 0], [0, 0, 1.01373, 0], [0, 0, 0, 9.23004]]
|
346
|
+
assert_equal true, Matrix.diag_in_delta?(e, a.cJacobiA, 1.0e-5)
|
347
|
+
end
|
348
|
+
|
349
|
+
|
350
|
+
def test_eigenvaluesJacobi
|
351
|
+
a = Matrix[[1, 1, 1, 4],
|
352
|
+
[1, 1, 0, 5],
|
353
|
+
[1, 0, 1, 4],
|
354
|
+
[4, 5, 4, 1]]
|
355
|
+
eigens = Vector[-0.268280385530705, -5.97550058143538, 1.01373431639199, 9.2300466505741]
|
356
|
+
assert_in_delta 0, (eigens - a.eigenvaluesJacobi).norm, 1.0e-10
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|