nmatrix 0.0.5 → 0.0.6

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +102 -10
  3. data/README.rdoc +24 -32
  4. data/Rakefile +1 -1
  5. data/ext/nmatrix/data/complex.h +9 -0
  6. data/ext/nmatrix/data/data.cpp +78 -4
  7. data/ext/nmatrix/data/data.h +86 -54
  8. data/ext/nmatrix/data/rational.h +2 -0
  9. data/ext/nmatrix/data/ruby_object.h +38 -8
  10. data/ext/nmatrix/extconf.rb +13 -7
  11. data/ext/nmatrix/nmatrix.cpp +262 -139
  12. data/ext/nmatrix/nmatrix.h +11 -4
  13. data/ext/nmatrix/storage/common.cpp +20 -13
  14. data/ext/nmatrix/storage/common.h +18 -12
  15. data/ext/nmatrix/storage/dense.cpp +122 -192
  16. data/ext/nmatrix/storage/dense.h +4 -2
  17. data/ext/nmatrix/storage/list.cpp +467 -636
  18. data/ext/nmatrix/storage/list.h +6 -3
  19. data/ext/nmatrix/storage/storage.cpp +83 -46
  20. data/ext/nmatrix/storage/storage.h +7 -7
  21. data/ext/nmatrix/storage/yale.cpp +621 -361
  22. data/ext/nmatrix/storage/yale.h +21 -9
  23. data/ext/nmatrix/ttable_helper.rb +27 -31
  24. data/ext/nmatrix/types.h +1 -1
  25. data/ext/nmatrix/util/math.cpp +9 -10
  26. data/ext/nmatrix/util/sl_list.cpp +1 -7
  27. data/ext/nmatrix/util/sl_list.h +0 -118
  28. data/lib/nmatrix/blas.rb +59 -18
  29. data/lib/nmatrix/monkeys.rb +0 -52
  30. data/lib/nmatrix/nmatrix.rb +136 -9
  31. data/lib/nmatrix/nvector.rb +33 -0
  32. data/lib/nmatrix/shortcuts.rb +95 -16
  33. data/lib/nmatrix/version.rb +1 -1
  34. data/lib/nmatrix/yale_functions.rb +25 -19
  35. data/spec/blas_spec.rb +1 -19
  36. data/spec/elementwise_spec.rb +132 -17
  37. data/spec/lapack_spec.rb +0 -3
  38. data/spec/nmatrix_list_spec.rb +18 -0
  39. data/spec/nmatrix_spec.rb +44 -18
  40. data/spec/nmatrix_yale_spec.rb +1 -3
  41. data/spec/shortcuts_spec.rb +26 -36
  42. data/spec/slice_spec.rb +2 -4
  43. metadata +2 -2
@@ -26,6 +26,6 @@ class NMatrix
26
26
  # Note that the format of the VERSION string is needed for NMatrix
27
27
  # native IO. If you change the format, please make sure that native
28
28
  # IO can still understand NMatrix::VERSION.
29
- VERSION = "0.0.5"
29
+ VERSION = "0.0.6"
30
30
  end
31
31
 
@@ -39,33 +39,36 @@ module NMatrix::YaleFunctions
39
39
  end
40
40
 
41
41
  # call-seq:
42
- # yale_nd_row_as_array -> Array
42
+ # yale_ja_at(i) -> Array
43
43
  #
44
44
  # Returns the non-diagonal column indices which are stored in a given row.
45
- def yale_nd_row_as_array i
46
- yale_nd_row(i, :array)
45
+ def yale_ja_at i
46
+ yale_nd_row(i, :keys)
47
47
  end
48
+ alias :yale_nd_row_as_array :yale_ja_at
48
49
 
49
50
  # call-seq:
50
- # yale_nd_row_as_set -> Set
51
+ # yale_ja_set_at(i) -> Set
51
52
  #
52
53
  # Returns the non-diagonal column indices which are stored in a given row, as a Set.
53
- def yale_nd_row_as_set i
54
+ def yale_ja_set_at i
54
55
  require 'set'
55
- yale_nd_row(i, :array).to_set
56
+ yale_nd_row(i, :keys).to_set
56
57
  end
58
+ alias :yale_nd_row_as_set :yale_ja_set_at
57
59
 
58
60
  # call-seq:
59
- # yale_nd_row_as_sorted_set -> SortedSet
61
+ # yale_ja_sorted_set_at -> SortedSet
60
62
  #
61
63
  # Returns the non-diagonal column indices which are stored in a given row, as a Set.
62
- def yale_nd_row_as_sorted_set i
64
+ def yale_ja_sorted_set_at i
63
65
  require 'set'
64
- SortedSet.new(yale_nd_row(i, :array))
66
+ SortedSet.new(yale_nd_row(i, :keys))
65
67
  end
68
+ alias :yale_nd_row_as_sorted_set :yale_ja_sorted_set_at
66
69
 
67
70
  # call-seq:
68
- # yale_nd_row_as_hash -> Hash
71
+ # yale_nd_row_as_hash(i) -> Hash
69
72
  #
70
73
  # Returns the non-diagonal column indices and entries stored in a given row.
71
74
  def yale_nd_row_as_hash i
@@ -73,35 +76,38 @@ module NMatrix::YaleFunctions
73
76
  end
74
77
 
75
78
  # call-seq:
76
- # yale_row_as_array -> Array
79
+ # yale_ja_d_keys_at(i) -> Array
77
80
  #
78
81
  # Returns the diagonal and non-digonal column indices stored in a given row.
79
- def yale_row_as_array i
80
- ary = yale_nd_row(i, :array)
82
+ def yale_ja_d_keys_at i
83
+ ary = yale_nd_row(i, :keys)
81
84
  return ary if i >= self.shape[1] || self[i,i].nil? || self[i,i] == 0
82
85
  ary << i
83
86
  end
87
+ alias :yale_row_as_array :yale_ja_d_keys_at
84
88
 
85
89
  # call-seq:
86
- # yale_row_as_set -> Set
90
+ # yale_ja_d_keys_set_at(i) -> Set
87
91
  #
88
92
  # Returns the diagonal and non-diagonal column indices stored in a given row.
89
- def yale_row_as_set i
93
+ def yale_ja_d_keys_set_at i
90
94
  require 'set'
91
- yale_row_as_array(i).to_set
95
+ yale_ja_d_keys_at(i).to_set
92
96
  end
97
+ alias :yale_row_as_set :yale_ja_d_keys_set_at
93
98
 
94
99
  # call-seq:
95
- # yale_row_as_sorted_set -> SortedSet
100
+ # yale_ja_d_keys_sorted_set_at(i) -> SortedSet
96
101
  #
97
102
  # Returns the diagonal and non-diagonal column indices stored in a given row.
98
- def yale_row_as_sorted_set i
103
+ def yale_ja_d_keys_sorted_set_at i
99
104
  require 'set'
100
105
  SortedSet.new(yale_row_as_array(i))
101
106
  end
107
+ alias :yale_row_as_sorted_set :yale_ja_d_keys_sorted_set_at
102
108
 
103
109
  # call-seq:
104
- # yale_row_as_hash -> Hash
110
+ # yale_row_as_hash(i) -> Hash
105
111
  #
106
112
  # Returns the diagonal and non-diagonal column indices and entries stored in a given row.
107
113
  def yale_row_as_hash i
data/spec/blas_spec.rb CHANGED
@@ -67,23 +67,6 @@ describe NMatrix::BLAS do
67
67
 
68
68
  [:float32, :float64].each do |dtype|
69
69
  context dtype do
70
- it "exposes unfriendly cblas_rot" do
71
- x = NVector.new(5, [1,2,3,4,5], dtype)
72
- y = NVector.new(5, [-5,-4,-3,-2,-1], dtype)
73
- NMatrix::BLAS::cblas_rot(5, x, 1, y, -1, 0.5, Math.sqrt(3)/2)
74
-
75
- x[0].should be_within(1e-4).of(-0.3660254037844386)
76
- x[1].should be_within(1e-4).of(-0.7320508075688772)
77
- x[2].should be_within(1e-4).of(-1.098076211353316)
78
- x[3].should be_within(1e-4).of(-1.4641016151377544)
79
- x[4].should be_within(1e-4).of(-1.8301270189221928)
80
-
81
- y[0].should be_within(1e-4).of(-6.830127018922193)
82
- y[1].should be_within(1e-4).of(-5.464101615137754)
83
- y[2].should be_within(1e-4).of(-4.098076211353316)
84
- y[3].should be_within(1e-4).of(-2.732050807568877)
85
- y[4].should be_within(1e-4).of(-1.3660254037844386)
86
- end
87
70
 
88
71
  it "exposes cblas rot" do
89
72
  x = NVector.new(5, [1,2,3,4,5], dtype)
@@ -103,10 +86,9 @@ describe NMatrix::BLAS do
103
86
  y[4].should be_within(1e-4).of(-1.3660254037844386)
104
87
  end
105
88
 
106
- # FIXME: Need to write new Rational algorithm, which doesn't choke quite so often on irrational square roots (which often eventually cancel).
107
89
  it "exposes cblas rotg" do
108
90
  ab = NVector.new(2, [6,-8], dtype)
109
- c,s = NMatrix::BLAS::cblas_rotg(ab)
91
+ c,s = NMatrix::BLAS::rotg(ab)
110
92
  ab[0].should be_within(1e-6).of(-10)
111
93
  ab[1].should be_within(1e-6).of(-5.quo(3))
112
94
  c.should be_within(1e-6).of(-3.quo(5))
@@ -30,6 +30,95 @@ require File.join(File.dirname(__FILE__), "spec_helper.rb")
30
30
 
31
31
  describe NMatrix do
32
32
 
33
+ context "yale" do
34
+ before :each do
35
+ @n = NMatrix.new(:yale, 3, :int64)
36
+ @m = NMatrix.new(:yale, 3, :int64)
37
+ @n[0,0] = 52
38
+ @n[0,2] = 5
39
+ @n[1,1] = 40
40
+ @n[0,1] = 30
41
+ @n[2,0] = 6
42
+ @m[1,1] = -48
43
+ @m[0,2] = -5
44
+ @n.extend NMatrix::YaleFunctions
45
+ end
46
+
47
+ it "should perform scalar math" do
48
+ x = @n * 3
49
+ x[0,0].should == 52 * 3
50
+ x[0,1].should == 30 * 3
51
+ x[0,2].should == 5 * 3
52
+ x[1,1].should == 40 * 3
53
+ x[2,0].should == 6 * 3
54
+
55
+ r = NMatrix.new(:yale, 3, :int64)
56
+ y = r + 3
57
+ y[0,0].should == 3
58
+ end
59
+
60
+ it "should refuse to perform a dot operation on a yale with non-zero default" do
61
+ r = NMatrix.new(:yale, 3, :int64)
62
+ y = r + 3
63
+ expect { y.dot(r) }.to raise_error
64
+ expect { r.dot(y) }.to raise_error
65
+ end
66
+
67
+ it "should perform element-wise addition" do
68
+ r = NMatrix.new(:dense, 3, [52,30,0,0,-8,0,6,0,0], :int64).cast(:yale, :int64)
69
+ r[0,0] = 52
70
+ r[1,1] = -8
71
+ q = @n + @m
72
+ q.should == r
73
+ end
74
+
75
+ it "should perform element-wise subtraction" do
76
+ (@n-@m).should == NMatrix.new(:dense, 3, [52,30,10,0,88,0,6,0,0], :int64).cast(:yale, :int64)
77
+ end
78
+
79
+ it "should perform element-wise multiplication" do
80
+ r = NMatrix.new(:dense, 3, [0,0,-25,0,-1920,0,0,0,0], :int64).cast(:yale, :int64)
81
+ m = NMatrix.new(:yale, 2, :int64)
82
+ (@n*@m).should == r
83
+ end
84
+
85
+ it "should perform element-wise division" do
86
+ r = NMatrix.new(:dense, 3, [52, 30, -2, 0, -1, 0, 6, 0, 0], :int64).cast(:yale, :int64)
87
+ (@n/(@m+1)).should == r
88
+ end
89
+
90
+ it "should perform element-wise modulo" do
91
+ m = NMatrix.new(:yale, 3, :int64) + 5
92
+ (@n % m).should == NMatrix.new(:dense, 3, [2,0,0,0,0,0,1,0,0], :int64).cast(:yale, :int64)
93
+ end
94
+
95
+ it "should handle element-wise equality (=~)" do
96
+ (@n =~ @m).should == NMatrix.new(:dense, 3, [false,false,false,true,false,true,false,true,true], :object).cast(:yale, :object, false)
97
+ end
98
+
99
+ it "should handle element-wise inequality (!~)" do
100
+ (@n !~ @m).should == NMatrix.new(:dense, 3, [true,true,true,false,true,false,true,false,false], :object).cast(:yale, :object, true)
101
+ end
102
+
103
+ it "should handle element-wise less-than (<)" do
104
+ (@m < @n).should == NMatrix.new(:dense, 3, [true,true,true,false,true,false,true,false,false], :object).cast(:yale, :object, true)
105
+ end
106
+
107
+ it "should handle element-wise greater-than (>)" do
108
+ (@n > @m).should == NMatrix.new(:dense, 3, [true,true,true,false,true,false,true,false,false], :object).cast(:yale, :object, false)
109
+ end
110
+
111
+ it "should handle element-wise greater-than-or-equals (>=)" do
112
+ (@n >= @m).should == NMatrix.new(:dense, 3, true, :object).cast(:yale,:object, true)
113
+ end
114
+
115
+ it "should handle element-wise less-than-or-equals (<=)" do
116
+ r = NMatrix.new(:dense, 3, [false,false,false,true,false,true,false,true,true], :object).cast(:yale, :object, false)
117
+ (@n <= @m).should == r
118
+ end
119
+ end
120
+
121
+
33
122
  context "list" do
34
123
  before :each do
35
124
  @n = NMatrix.new(:list, 2, 0, :int64)
@@ -51,12 +140,15 @@ describe NMatrix do
51
140
  end
52
141
 
53
142
  it "should perform element-wise addition" do
54
- r = NMatrix.new(:dense, 2, [52, 0, 0, -8], :int64).cast(:list, :int64)
55
- (@n+@m).should == r
143
+ r = NMatrix.new(:list, 2, 0, :int64)
144
+ r[0,0] = 52
145
+ r[1,1] = -8
146
+ q = @n + @m
147
+ q.should == r
56
148
  end
57
149
 
58
150
  it "should perform element-wise subtraction" do
59
- r = NMatrix.new(:dense, 2, [52, 0, 0, -88], :int64).cast(:list, :int64)
151
+ r = NMatrix.new(:dense, 2, [52, 0, 0, 88], :int64).cast(:list, :int64)
60
152
  (@n-@m).should == r
61
153
  end
62
154
 
@@ -75,31 +167,48 @@ describe NMatrix do
75
167
  end
76
168
 
77
169
  it "should perform element-wise modulo" do
78
- pending "% operator not yet implemented for matrices"
170
+ m = NMatrix.new(:list, 2, 1, :int64)
171
+ m[0,0] = 50
172
+ m[1,1] = 40
173
+ (@n % m)
79
174
  end
80
175
 
81
176
  it "should handle element-wise equality (=~)" do
82
- (@n =~ @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [0, 1, 1, 0], :byte)
177
+ r = NMatrix.new(:list, 2, false, :object)
178
+ r[0,1] = true
179
+ r[1,0] = true
180
+
181
+ (@n =~ @m).should == r
83
182
  end
84
183
 
85
184
  it "should handle element-wise inequality (!~)" do
86
- (@n !~ @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [1, 0, 0, 1], :byte)
185
+ r = NMatrix.new(:list, 2, false, :object)
186
+ r[0,0] = true
187
+ r[1,1] = true
188
+
189
+ (@n !~ @m).should == r
87
190
  end
88
191
 
89
192
  it "should handle element-wise less-than (<)" do
90
- (@n < @m).should == NMatrix.new(:list, 2, 0, :byte)
193
+ (@n < @m).should == NMatrix.new(:list, 2, false, :object)
91
194
  end
92
195
 
93
196
  it "should handle element-wise greater-than (>)" do
94
- (@n > @m).should == NMatrix.new(:dense, 2, [1, 0, 0, 1], :byte).cast(:list, :byte)
197
+ r = NMatrix.new(:list, 2, false, :object)
198
+ r[0,0] = true
199
+ r[1,1] = true
200
+ (@n > @m).should == r
95
201
  end
96
202
 
97
203
  it "should handle element-wise greater-than-or-equals (>=)" do
98
- (@n >= @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [1, 1, 1, 1], :byte)
204
+ (@n >= @m).should == NMatrix.new(:list, 2, true, :object)
99
205
  end
100
206
 
101
207
  it "should handle element-wise less-than-or-equals (<=)" do
102
- (@n <= @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [0, 1, 1, 0], :byte)
208
+ r = NMatrix.new(:list, 2, false, :object)
209
+ r[0,1] = true
210
+ r[1,0] = true
211
+ (@n <= @m).should == r
103
212
  end
104
213
  end
105
214
 
@@ -132,6 +241,12 @@ describe NMatrix do
132
241
  r.should == NMatrix.new(:dense, [2,2], [-1, -2, 1, 0], :int64)
133
242
  end
134
243
 
244
+ #it "exponentiates" do
245
+ # r = @n ** 2
246
+ # # TODO: We might have problems with the dtype.
247
+ # r.should == NMatrix.new(:dense, [2,2], [1, 4, 9, 16], :int64)
248
+ #end
249
+
135
250
  it "modulo" do
136
251
  pending "% operator not yet implemented"
137
252
  r = @n % @m
@@ -147,33 +262,33 @@ describe NMatrix do
147
262
 
148
263
  it "equals" do
149
264
  r = @n =~ @m
150
- r.should == NMatrix.new(:dense, [2,2], [0, 0, 1, 0], :byte)
265
+ r.should == NMatrix.new(:dense, [2,2], [false, false, true, false], :object)
151
266
  end
152
267
 
153
268
  it "is not equal" do
154
269
  r = @n !~ @m
155
- r.should == NMatrix.new(:dense, [2,2], [1, 1, 0, 1], :byte)
270
+ r.should == NMatrix.new(:dense, [2,2], [true, true, false, true], :object)
156
271
  end
157
272
 
158
273
  it "is less than" do
159
274
  r = @n < @m
160
- r.should == NMatrix.new(:dense, [2,2], 0, :byte)
275
+ r.should == NMatrix.new(:dense, [2,2], false, :object)
161
276
  end
162
277
 
163
278
  it "is greater than" do
164
279
  r = @n > @m
165
- r.should == NMatrix.new(:dense, [2,2], [1, 1, 0, 1], :byte)
280
+ r.should == NMatrix.new(:dense, [2,2], [true, true, false, true], :object)
166
281
  end
167
282
 
168
283
  it "is less than or equal to" do
169
284
  r = @n <= @m
170
- r.should == NMatrix.new(:dense, [2,2], [0, 0, 1, 0], :byte)
285
+ r.should == NMatrix.new(:dense, [2,2], [false, false, true, false], :object)
171
286
  end
172
287
 
173
288
  it "is greater than or equal to" do
174
- n = NMatrix.new(:dense, [2,2], [ 1, 2, 2, 4], :int64)
289
+ n = NMatrix.new(:dense, [2,2], [1, 2, 2, 4], :int64)
175
290
  r = n >= @m
176
- r.should == NMatrix.new(:dense, [2,2], [1, 1, 0, 1], :byte)
291
+ r.should == NMatrix.new(:dense, [2,2], [true, true, false, true], :object)
177
292
  end
178
293
  end
179
294
  end
data/spec/lapack_spec.rb CHANGED
@@ -67,9 +67,6 @@ describe NMatrix::LAPACK do
67
67
  a[2,0].should == 1 # 3.quo(8)
68
68
  a[2,1].should be_within(err).of(52.quo(9))
69
69
  a[2,2].should be_within(err).of(360.quo(53))
70
- # FIXME: these are rounded, == won't work
71
- #a[2,1].should == 0.544118
72
- #a[2,2].should == 5.294118
73
70
  end
74
71
 
75
72
  it "exposes clapack potrf" do
@@ -43,6 +43,24 @@ describe NMatrix do
43
43
  n.should == m
44
44
  end
45
45
 
46
+ it "should compare 0-1 matrices with different default values with ==" do
47
+ n = NMatrix.new(:list, 2, 0, :object)
48
+ n[0,1] = 1
49
+ n[1,0] = 1
50
+
51
+ m = NMatrix.new(:list, 2, 1, :object)
52
+ m[0,0] = 0
53
+ m[1,1] = 0
54
+
55
+ n.should == m
56
+ end
57
+
58
+ it "should allow creation of both true- and false-based matrix" do
59
+ r1 = NMatrix.new(:list, 2, false, :object)
60
+ r2 = NMatrix.new(:list, 2, true, :object)
61
+ r1.should_not == r2
62
+ end
63
+
46
64
  it "should handle missing default value" do
47
65
  NMatrix.new(:list, 3, :int8)[0,0].should == 0
48
66
  NMatrix.new(:list, 4, :float64)[0,0].should == 0.0
data/spec/nmatrix_spec.rb CHANGED
@@ -31,7 +31,7 @@ describe NMatrix do
31
31
 
32
32
  it "calculates exact determinants on small square matrices" do
33
33
  a = NMatrix.new(:dense, 2, [1,2,3,4], :int64)
34
- x = a.det_exact
34
+ a.det_exact.should == -2
35
35
  end
36
36
 
37
37
  it "calculates determinants" do
@@ -39,11 +39,23 @@ describe NMatrix do
39
39
  m.det.should == 6
40
40
  end
41
41
 
42
+ it "allows casting to Ruby objects" do
43
+ m = NMatrix.new(:dense, [3,3], [0,0,1,0,2,0,3,4,5], :int64)
44
+ n = m.cast(:dense, :object)
45
+ n.should == m
46
+ end
47
+
48
+ it "allows casting from Ruby objects" do
49
+ m = NMatrix.new(:dense, [3,3], [0,0,1,0,2,0,3,4,5], :object)
50
+ n = m.cast(:dense, :int64)
51
+ m.should == n
52
+ end
53
+
42
54
  it "allows stype casting of a dim 2 matrix between dense, sparse, and list (different dtypes)" do
43
55
  m = NMatrix.new(:dense, [3,3], [0,0,1,0,2,0,3,4,5], :int64).
44
56
  cast(:yale, :int32).
45
57
  cast(:dense, :float64).
46
- cast(:list, :int32).
58
+ cast(:list, :object).
47
59
  cast(:dense, :int16).
48
60
  cast(:list, :int32).
49
61
  cast(:yale, :int64) #.
@@ -185,14 +197,31 @@ describe NMatrix do
185
197
  c = dtype == :object ? "Ruby object" : "non-Ruby object"
186
198
  context c do
187
199
  it "allows iteration of matrices" do
188
- pending("yale and list not implemented yet") unless storage_type == :dense
189
- n = NMatrix.new(:dense, [3,3], [1,2,3,4,5,6,7,8,9], dtype)
200
+ n = nil
201
+ if storage_type == :dense
202
+ n = NMatrix.new(:dense, [3,3], [1,2,3,4,5,6,7,8,9], dtype)
203
+ else
204
+ n = storage_type == :yale ? NMatrix.new(storage_type, [3,4], dtype) : NMatrix.new(storage_type, [3,4], 0, dtype)
205
+ n[0,0] = 1
206
+ n[0,1] = 2
207
+ n[2,3] = 4
208
+ n[2,0] = 3
209
+ end
210
+ ary = []
190
211
  n.each do |x|
191
- puts x
212
+ ary << x
213
+ end
214
+
215
+ if storage_type == :dense
216
+ ary.should == [1,2,3,4,5,6,7,8,9]
217
+ else
218
+ ary.should == [1,2,0,0,0,0,0,0,3,0,0,4]
192
219
  end
193
220
  end
194
221
 
195
222
  it "allows storage-based iteration of matrices" do
223
+ STDERR.puts storage_type.inspect
224
+ STDERR.puts dtype.inspect
196
225
  n = storage_type == :yale ? NMatrix.new(storage_type, [3,3], dtype) : NMatrix.new(storage_type, [3,3], 0, dtype)
197
226
  n[0,0] = 1
198
227
  n[0,1] = 2
@@ -297,7 +326,7 @@ describe NMatrix do
297
326
  val = (a.each { })
298
327
  val.should eq a
299
328
  end
300
-
329
+
301
330
  it "should return the matrix being iterated over when each_stored_with_indices is called with a block" do
302
331
  a = NMatrix.new(2,1)
303
332
  val = (a.each_stored_with_indices { })
@@ -321,13 +350,13 @@ describe NMatrix do
321
350
 
322
351
  end
323
352
  end
324
-
353
+
325
354
  it "should iterate through element 256 without a segfault" do
326
355
  t = NVector.random(256)
327
356
  t.each { |x| x + 0 }
328
357
  end
329
358
 
330
- context "mapping and reduction related functions" do
359
+ context "mapping and reduction related functions" do
331
360
 
332
361
  before :each do
333
362
  @nm_1d = N[5.0,0.0,1.0,2.0,3.0]
@@ -344,7 +373,7 @@ describe NMatrix do
344
373
  @nm_2d.mean.should eq N[[1.0,2.0]]
345
374
  end
346
375
 
347
- it "should calculate the minimum along the specified dimension" do
376
+ it "should calculate the minimum along the specified dimension" do
348
377
  @nm_1d.min.should eq 0.0
349
378
  @nm_2d.min.should eq N[[0.0, 1.0]]
350
379
  @nm_2d.min(1).should eq N[[0.0], [2.0]]
@@ -370,11 +399,11 @@ describe NMatrix do
370
399
  @nm_2d.std(1).should eq N[[Math.sqrt(0.5)], [Math.sqrt(0.5)]]
371
400
  end
372
401
 
373
- it "should raise an ArgumentError when any invalid dimension is provided" do
402
+ it "should raise an ArgumentError when any invalid dimension is provided" do
374
403
  expect { @nm_1d.mean(3) }.to raise_exception(ArgumentError)
375
404
  end
376
405
 
377
- it "should convert to float if it contains only a single element" do
406
+ it "should convert to float if it contains only a single element" do
378
407
  N[4.0].to_f.should eq 4.0
379
408
  N[[[[4.0]]]].to_f.should eq 4.0
380
409
  end
@@ -383,7 +412,7 @@ describe NMatrix do
383
412
  expect { @nm_1d.to_f }.to raise_error(IndexError)
384
413
  end
385
414
 
386
- it "should map a block to all elements" do
415
+ it "should map a block to all elements" do
387
416
  @nm_1d.map { |e| e ** 2 }.should eq N[25.0,0.0,1.0,4.0,9.0]
388
417
  @nm_2d.map { |e| e ** 2 }.should eq N[[0.0,1.0],[4.0,9.0]]
389
418
  end
@@ -478,12 +507,12 @@ describe NMatrix do
478
507
 
479
508
  it "should convert integer dtypes to float when calculating variance" do
480
509
  m = N[[1,2,3], [3,4,5], :int32]
481
- m.mean(0).dtype.should eq :float64
510
+ m.variance(0).dtype.should eq :float64
482
511
  end
483
512
 
484
513
  it "should convert integer dtypes to float when calculating standard deviation" do
485
514
  m = N[[1,2,3], [3,4,5], :int32]
486
- m.mean(0).dtype.should eq :float64
515
+ m.std(0).dtype.should eq :float64
487
516
  end
488
517
 
489
518
  context "_like constructors" do
@@ -493,13 +522,10 @@ describe NMatrix do
493
522
  NMatrix.ones_like(@nm_2d).should eq N[[1.0, 1.0], [1.0, 1.0]]
494
523
  end
495
524
 
496
- it "should create an nmatrix of zeros with dimensions and type the same as its argument" do
525
+ it "should create an nmatrix of zeros with dimensions and type the same as its argument" do
497
526
  NMatrix.zeros_like(@nm_1d).should eq N[0.0, 0.0, 0.0, 0.0, 0.0]
498
527
  NMatrix.zeros_like(@nm_2d).should eq N[[0.0, 0.0], [0.0, 0.0]]
499
528
  end
500
-
501
529
  end
502
-
503
530
  end
504
-
505
531
  end