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
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
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
|
+
# == spec_helper.rb
|
|
24
|
+
#
|
|
25
|
+
# Common data and helper functions for testing.
|
|
26
|
+
|
|
27
|
+
require "rspec/longrun"
|
|
28
|
+
#require "narray/narray"
|
|
29
|
+
|
|
30
|
+
require "./lib/nmatrix"
|
|
31
|
+
require "./lib/nmatrix/rspec"
|
|
32
|
+
|
|
33
|
+
ALL_DTYPES = [:byte,:int8,:int16,:int32,:int64, :float32,:float64, :object,
|
|
34
|
+
:complex64, :complex128]
|
|
35
|
+
|
|
36
|
+
NON_INTEGER_DTYPES = [:float32, :float64, :complex64, :complex128,
|
|
37
|
+
:object]
|
|
38
|
+
|
|
39
|
+
FLOAT_DTYPES = [:float32, :float64]
|
|
40
|
+
|
|
41
|
+
MATRIX43A_ARRAY = [14.0, 9.0, 3.0, 2.0, 11.0, 15.0, 0.0, 12.0, 17.0, 5.0, 2.0, 3.0]
|
|
42
|
+
MATRIX32A_ARRAY = [12.0, 25.0, 9.0, 10.0, 8.0, 5.0]
|
|
43
|
+
|
|
44
|
+
COMPLEX_MATRIX43A_ARRAY = MATRIX43A_ARRAY.zip(MATRIX43A_ARRAY.reverse).collect { |ary| Complex(ary[0], ary[1]) }
|
|
45
|
+
COMPLEX_MATRIX32A_ARRAY = MATRIX32A_ARRAY.zip(MATRIX32A_ARRAY.reverse).collect { |ary| Complex(ary[0], -ary[1]) }
|
|
46
|
+
|
|
47
|
+
#3x4 matrix used for testing various getrf and LU decomposition functions
|
|
48
|
+
GETRF_EXAMPLE_ARRAY = [-1,0,10,4,9,2,3,5,7,8,1,6]
|
|
49
|
+
GETRF_SOLUTION_ARRAY = [9.0, 2.0, 3.0, 5.0, 7.0/9, 58.0/9, -4.0/3, 19.0/9, -1.0/9, 1.0/29, 301.0/29, 130.0/29]
|
|
50
|
+
|
|
51
|
+
TAU_SOLUTION_ARRAY = [1.8571428571428572,1.9938461538461538, 0.0]
|
|
52
|
+
|
|
53
|
+
GEQRF_SOLUTION_ARRAY =[ -14.0, -21.0, 14.000000000000002,
|
|
54
|
+
0.23076923076923078, -175.00000000000003, 70.00000000000001,
|
|
55
|
+
-0.15384615384615385, 0.055555555555555546, -35.0]
|
|
56
|
+
|
|
57
|
+
R_SOLUTION_ARRAY = [-159.2388143638353, -41.00131005172065, -56.75123892439876, -90.75048729628048,
|
|
58
|
+
0.0, 25.137473501580676, 2.073591725046292, 9.790607357775713,
|
|
59
|
+
0.0, 0.0, -20.83259700334131, -17.592414929551445]
|
|
60
|
+
|
|
61
|
+
Q_SOLUTION_ARRAY_1 = [-0.632455532033676, -0.5209522876558295, -0.3984263084135902, -0.41214704991068,
|
|
62
|
+
-0.42783756578748666, -0.20837937347171134, 0.876505919951498, 0.07259770177184455,
|
|
63
|
+
-0.48364246567281094, 0.8265854747306287,-0.015758658987033422, -0.2873988222474053,
|
|
64
|
+
-0.42783756578748666, 0.044081783789183565, -0.26971376257215296, 0.8615487797670971]
|
|
65
|
+
|
|
66
|
+
Q_SOLUTION_ARRAY_2 = [-0.8571428571428572, 0.3942857142857143, 0.33142857142857146,
|
|
67
|
+
-0.4285714285714286, -0.9028571428571428, -0.03428571428571425,
|
|
68
|
+
0.28571428571428575, -0.1714285714285714, 0.9428571428571428]
|
|
69
|
+
|
|
70
|
+
Q_SOLUTION_ARRAY_3 = [-0.7724247413634004, -0.026670393594597247, -0.6345460653374136,
|
|
71
|
+
-0.5777485870360393, -0.38541856437557026, 0.7194853024298236,
|
|
72
|
+
-0.26375478973384403, 0.9223563413020934, 0.28229805268947933]
|
|
73
|
+
|
|
74
|
+
def create_matrix(stype) #:nodoc:
|
|
75
|
+
m = NMatrix.new([3,3], 0, dtype: :int32, stype: stype, default: 0)
|
|
76
|
+
|
|
77
|
+
m[0,0] = 0
|
|
78
|
+
m[0,1] = 1
|
|
79
|
+
m[0,2] = 2
|
|
80
|
+
m[1,0] = 3
|
|
81
|
+
m[1,1] = 4
|
|
82
|
+
m[1,2] = 5
|
|
83
|
+
m[2,0] = 6
|
|
84
|
+
m[2,1] = 7
|
|
85
|
+
m[2,2] = 8
|
|
86
|
+
|
|
87
|
+
m
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def create_rectangular_matrix(stype) #:nodoc:
|
|
91
|
+
m = NMatrix.new([5,6], 0, dtype: :int32, stype: stype, default: 0)
|
|
92
|
+
|
|
93
|
+
m[0,0] = 1
|
|
94
|
+
m[0,1] = 2
|
|
95
|
+
m[0,2] = 3
|
|
96
|
+
m[0,3] = 4
|
|
97
|
+
m[0,4] = 5
|
|
98
|
+
m[0,5] = 0
|
|
99
|
+
|
|
100
|
+
m[1,0] = 6
|
|
101
|
+
m[1,1] = 7
|
|
102
|
+
m[1,2] = 8
|
|
103
|
+
m[1,3] = 9
|
|
104
|
+
m[1,4] = 0
|
|
105
|
+
m[1,5] = 10
|
|
106
|
+
|
|
107
|
+
m[2,0] = 11
|
|
108
|
+
m[2,1] = 12
|
|
109
|
+
m[2,2] = 13
|
|
110
|
+
m[2,3] = 0
|
|
111
|
+
m[2,4] = 14
|
|
112
|
+
m[2,5] = 15
|
|
113
|
+
|
|
114
|
+
# skip row 3 -- all 0
|
|
115
|
+
m[3,0] = m[3,1] = m[3,2] = m[3,3] = m[3,4] = m[3,5] = 0
|
|
116
|
+
|
|
117
|
+
m[4,0] = 16
|
|
118
|
+
m[4,1] = 0
|
|
119
|
+
m[4,2] = 17
|
|
120
|
+
m[4,3] = 18
|
|
121
|
+
m[4,4] = 19
|
|
122
|
+
m[4,5] = 20
|
|
123
|
+
|
|
124
|
+
m
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def create_vector(stype) #:nodoc:
|
|
128
|
+
m = stype == :yale ? NVector.new(stype, 10, :int32) : NVector.new(stype, 10, 0, :int32)
|
|
129
|
+
|
|
130
|
+
m[0] = 1
|
|
131
|
+
m[1] = 2
|
|
132
|
+
m[2] = 3
|
|
133
|
+
m[3] = 4
|
|
134
|
+
m[4] = 5
|
|
135
|
+
m[5] = 6
|
|
136
|
+
m[6] = 7
|
|
137
|
+
m[7] = 8
|
|
138
|
+
m[8] = 9
|
|
139
|
+
m[9] = 10
|
|
140
|
+
|
|
141
|
+
m
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Stupid but independent comparison for slice_spec
|
|
145
|
+
def nm_eql(n, m) #:nodoc:
|
|
146
|
+
if n.shape != m.shape
|
|
147
|
+
false
|
|
148
|
+
else # NMatrix
|
|
149
|
+
n.shape[0].times do |i|
|
|
150
|
+
n.shape[1].times do |j|
|
|
151
|
+
if n[i,j] != m[i,j]
|
|
152
|
+
puts "n[#{i},#{j}] != m[#{i},#{j}] (#{n[i,j]} != #{m[i,j]})"
|
|
153
|
+
return false
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
true
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def integer_dtype? dtype
|
|
162
|
+
[:byte,:int8,:int16,:int32,:int64].include?(dtype)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# If a focus: true option is supplied to any test, running `rake spec focus=true`
|
|
166
|
+
# will run only the focused tests and nothing else.
|
|
167
|
+
if ENV["focus"] == "true"
|
|
168
|
+
RSpec.configure do |c|
|
|
169
|
+
c.filter_run :focus => true
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
data/spec/stat_spec.rb
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
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
|
+
# == stat_spec.rb
|
|
24
|
+
#
|
|
25
|
+
# Tests for statistical functions in NMatrix.
|
|
26
|
+
#
|
|
27
|
+
|
|
28
|
+
require 'spec_helper'
|
|
29
|
+
require 'pry'
|
|
30
|
+
|
|
31
|
+
describe "Statistical functions" do
|
|
32
|
+
context "mapping and reduction related functions" do
|
|
33
|
+
[:dense, :yale, :list].each do |stype|
|
|
34
|
+
context "on #{stype} matrices" do
|
|
35
|
+
let(:nm_1d) { NMatrix.new([5], [5.0,0.0,1.0,2.0,3.0], stype: stype) unless stype == :yale }
|
|
36
|
+
let(:nm_2d) { NMatrix.new([2,2], [0.0, 1.0, 2.0, 3.0], stype: stype) }
|
|
37
|
+
|
|
38
|
+
it "behaves like Enumerable#reduce with no argument to reduce" do
|
|
39
|
+
expect(nm_1d.reduce_along_dim(0) { |acc, el| acc + el }.to_f).to eq 11 unless stype == :yale
|
|
40
|
+
expect(nm_2d.reduce_along_dim(1) { |acc, el| acc + el }).to eq NMatrix.new([2,1], [1.0, 5.0], stype: stype)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should calculate the mean along the specified dimension" do
|
|
44
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
45
|
+
unless stype == :yale then
|
|
46
|
+
puts nm_1d.mean
|
|
47
|
+
expect(nm_1d.mean).to eq NMatrix.new([1], [2.2], stype: stype, dtype: :float64)
|
|
48
|
+
end
|
|
49
|
+
expect(nm_2d.mean).to eq NMatrix[[1.0,2.0], stype: stype]
|
|
50
|
+
expect(nm_2d.mean(1)).to eq NMatrix[[0.5], [2.5], stype: stype]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should calculate the minimum along the specified dimension" do
|
|
54
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
55
|
+
expect(nm_1d.min).to eq 0.0 unless stype == :yale
|
|
56
|
+
expect(nm_2d.min).to eq NMatrix[[0.0, 1.0], stype: stype]
|
|
57
|
+
expect(nm_2d.min(1)).to eq NMatrix[[0.0], [2.0], stype: stype]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "should calculate the maximum along the specified dimension" do
|
|
61
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
62
|
+
expect(nm_1d.max).to eq 5.0 unless stype == :yale
|
|
63
|
+
expect(nm_2d.max).to eq NMatrix[[2.0, 3.0], stype: stype]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should calculate the variance along the specified dimension" do
|
|
67
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
68
|
+
expect(nm_1d.variance).to eq NMatrix[3.7, stype: stype] unless stype == :yale
|
|
69
|
+
expect(nm_2d.variance(1)).to eq NMatrix[[0.5], [0.5], stype: stype]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "should calculate the sum along the specified dimension" do
|
|
73
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
74
|
+
expect(nm_1d.sum).to eq NMatrix[11.0, stype: stype] unless stype == :yale
|
|
75
|
+
expect(nm_2d.sum).to eq NMatrix[[2.0, 4.0], stype: stype]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should calculate the standard deviation along the specified dimension" do
|
|
79
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
80
|
+
expect(nm_1d.std).to eq NMatrix[Math.sqrt(3.7), stype: stype] unless stype == :yale
|
|
81
|
+
expect(nm_2d.std(1)).to eq NMatrix[[Math.sqrt(0.5)], [Math.sqrt(0.5)], stype: stype]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should raise an ArgumentError when any invalid dimension is provided" do
|
|
85
|
+
expect { nm_1d.mean(3) }.to raise_exception(RangeError) unless stype == :yale
|
|
86
|
+
expect { nm_2d.mean(3) }.to raise_exception(RangeError)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should convert to float if it contains only a single element" do
|
|
90
|
+
expect(NMatrix[4.0, stype: stype].to_f).to eq 4.0 unless stype == :yale
|
|
91
|
+
expect(NMatrix[[[[4.0]]], stype: stype].to_f).to eq 4.0 unless stype == :yale
|
|
92
|
+
expect(NMatrix[[4.0], stype: stype].to_f).to eq 4.0
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "should raise an index error if it contains more than a single element" do
|
|
96
|
+
expect { nm_1d.to_f }.to raise_error(IndexError) unless stype == :yale
|
|
97
|
+
expect { nm_2d.to_f }.to raise_error(IndexError)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it "should map a block to all elements" do
|
|
101
|
+
expect(nm_1d.map { |e| e ** 2 }).to eq NMatrix[25.0,0.0,1.0,4.0,9.0, stype: stype] unless stype == :yale
|
|
102
|
+
expect(nm_2d.map { |e| e ** 2 }).to eq NMatrix[[0.0,1.0],[4.0,9.0], stype: stype]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "should map! a block to all elements in place" do
|
|
106
|
+
fct = Proc.new { |e| e ** 2 }
|
|
107
|
+
unless stype == :yale then
|
|
108
|
+
expected1 = nm_1d.map(&fct)
|
|
109
|
+
nm_1d.map!(&fct)
|
|
110
|
+
expect(nm_1d).to eq expected1
|
|
111
|
+
end
|
|
112
|
+
expected2 = nm_2d.map(&fct)
|
|
113
|
+
nm_2d.map!(&fct)
|
|
114
|
+
expect(nm_2d).to eq expected2
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "should return an enumerator for map without a block" do
|
|
118
|
+
expect(nm_2d.map).to be_a Enumerator
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "should return an enumerator for reduce without a block" do
|
|
122
|
+
expect(nm_2d.reduce_along_dim(0)).to be_a Enumerator
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "should return an enumerator for each_along_dim without a block" do
|
|
126
|
+
expect(nm_2d.each_along_dim(0)).to be_a Enumerator
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should iterate correctly for map without a block" do
|
|
130
|
+
en = nm_1d.map unless stype == :yale
|
|
131
|
+
expect(en.each { |e| e**2 }).to eq nm_1d.map { |e| e**2 } unless stype == :yale
|
|
132
|
+
en = nm_2d.map
|
|
133
|
+
expect(en.each { |e| e**2 }).to eq nm_2d.map { |e| e**2 }
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it "should iterate correctly for reduce without a block" do
|
|
137
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
138
|
+
unless stype == :yale then
|
|
139
|
+
en = nm_1d.reduce_along_dim(0, 1.0)
|
|
140
|
+
expect(en.each { |a, e| a+e }.to_f).to eq 12
|
|
141
|
+
end
|
|
142
|
+
en = nm_2d.reduce_along_dim(1, 1.0)
|
|
143
|
+
expect(en.each { |a, e| a+e }).to eq NMatrix[[2.0],[6.0], stype: stype]
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it "should iterate correctly for each_along_dim without a block" do
|
|
147
|
+
unless stype == :yale then
|
|
148
|
+
res = NMatrix.zeros_like(nm_1d[0...1])
|
|
149
|
+
en = nm_1d.each_along_dim(0)
|
|
150
|
+
en.each { |e| res += e }
|
|
151
|
+
expect(res.to_f).to eq 11
|
|
152
|
+
end
|
|
153
|
+
res = NMatrix.zeros_like (nm_2d[0...2, 0])
|
|
154
|
+
en = nm_2d.each_along_dim(1)
|
|
155
|
+
en.each { |e| res += e }
|
|
156
|
+
expect(res).to eq NMatrix[[1.0], [5.0], stype: stype]
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "should yield matrices of matching dtype for each_along_dim" do
|
|
160
|
+
m = NMatrix.new([2,3], [1,2,3,3,4,5], dtype: :complex128, stype: stype)
|
|
161
|
+
m.each_along_dim(1) do |sub_m|
|
|
162
|
+
expect(sub_m.dtype).to eq :complex128
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "should reduce to a matrix of matching dtype for reduce_along_dim" do
|
|
167
|
+
m = NMatrix.new([2,3], [1,2,3,3,4,5], dtype: :complex128, stype: stype)
|
|
168
|
+
m.reduce_along_dim(1) do |acc, sub_m|
|
|
169
|
+
expect(sub_m.dtype).to eq :complex128
|
|
170
|
+
acc
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
m.reduce_along_dim(1, 0.0) do |acc, sub_m|
|
|
174
|
+
expect(sub_m.dtype).to eq :complex128
|
|
175
|
+
acc
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "should allow overriding the dtype for reduce_along_dim" do
|
|
180
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
181
|
+
m = NMatrix[[1,2,3], [3,4,5], dtype: :complex128]
|
|
182
|
+
m.reduce_along_dim(1, 0.0, :float64) do |acc, sub_m|
|
|
183
|
+
expect(acc.dtype).to eq :float64
|
|
184
|
+
acc
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
m = NMatrix[[1,2,3], [3,4,5], dtype: :complex128, stype: stype]
|
|
188
|
+
m.reduce_along_dim(1, nil, :float64) do |acc, sub_m|
|
|
189
|
+
expect(acc.dtype).to eq :float64
|
|
190
|
+
acc
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it "should convert integer dtypes to float when calculating mean" do
|
|
195
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
196
|
+
m = NMatrix[[1,2,3], [3,4,5], dtype: :int32, stype: stype]
|
|
197
|
+
expect(m.mean(0).dtype).to eq :float64
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
it "should convert integer dtypes to float when calculating variance" do
|
|
201
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
202
|
+
m = NMatrix[[1,2,3], [3,4,5], dtype: :int32, stype: stype]
|
|
203
|
+
expect(m.variance(0).dtype).to eq :float64
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
it "should convert integer dtypes to float when calculating standard deviation" do
|
|
207
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
|
208
|
+
m = NMatrix[[1,2,3], [3,4,5], dtype: :int32, stype: stype]
|
|
209
|
+
expect(m.std(0).dtype).to eq :float64
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
data/spec/test.pcd
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
VERSION .7
|
|
2
|
+
FIELDS x y z intensity
|
|
3
|
+
SIZE 4 8 8 4
|
|
4
|
+
TYPE F U F I
|
|
5
|
+
COUNT 1 1 1 1
|
|
6
|
+
WIDTH 256 # comment here to challenge this thing
|
|
7
|
+
HEIGHT 256
|
|
8
|
+
VIEWPOINT 0 0 0 1 0 0 0
|
|
9
|
+
POINTS 10
|
|
10
|
+
DATA ASCII
|
|
11
|
+
207.008 207.058 1174 0
|
|
12
|
+
207.008 205.441 1174 0
|
|
13
|
+
207.008 203.823 1174 0
|
|
14
|
+
207.008 202.206 1174 0
|
|
15
|
+
207.008 200.589 1174 0
|
|
16
|
+
207.008 198.972 1174 0
|
|
17
|
+
207.008 197.354 1174 0
|
|
18
|
+
207.008 195.737 1174 0
|
|
19
|
+
207.008 194.12 1174 0
|
|
20
|
+
207.008 153.689 1174 0
|