nmatrix 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.gitignore +3 -0
  2. data/CONTRIBUTING.md +66 -0
  3. data/Gemfile +1 -1
  4. data/History.txt +68 -10
  5. data/LICENSE.txt +2 -2
  6. data/Manifest.txt +2 -0
  7. data/README.rdoc +90 -69
  8. data/Rakefile +18 -9
  9. data/ext/nmatrix/data/complex.h +7 -7
  10. data/ext/nmatrix/data/data.cpp +2 -7
  11. data/ext/nmatrix/data/data.h +7 -4
  12. data/ext/nmatrix/data/rational.h +2 -2
  13. data/ext/nmatrix/data/ruby_object.h +3 -10
  14. data/ext/nmatrix/extconf.rb +79 -54
  15. data/ext/nmatrix/new_extconf.rb +11 -12
  16. data/ext/nmatrix/nmatrix.cpp +94 -125
  17. data/ext/nmatrix/nmatrix.h +38 -17
  18. data/ext/nmatrix/ruby_constants.cpp +2 -15
  19. data/ext/nmatrix/ruby_constants.h +2 -14
  20. data/ext/nmatrix/storage/common.cpp +2 -2
  21. data/ext/nmatrix/storage/common.h +2 -2
  22. data/ext/nmatrix/storage/dense.cpp +206 -31
  23. data/ext/nmatrix/storage/dense.h +5 -2
  24. data/ext/nmatrix/storage/list.cpp +52 -4
  25. data/ext/nmatrix/storage/list.h +3 -2
  26. data/ext/nmatrix/storage/storage.cpp +6 -6
  27. data/ext/nmatrix/storage/storage.h +2 -2
  28. data/ext/nmatrix/storage/yale.cpp +202 -49
  29. data/ext/nmatrix/storage/yale.h +5 -4
  30. data/ext/nmatrix/ttable_helper.rb +108 -108
  31. data/ext/nmatrix/types.h +2 -15
  32. data/ext/nmatrix/util/io.cpp +2 -2
  33. data/ext/nmatrix/util/io.h +2 -2
  34. data/ext/nmatrix/util/lapack.h +2 -2
  35. data/ext/nmatrix/util/math.cpp +14 -14
  36. data/ext/nmatrix/util/math.h +2 -2
  37. data/ext/nmatrix/util/sl_list.cpp +2 -2
  38. data/ext/nmatrix/util/sl_list.h +2 -2
  39. data/ext/nmatrix/util/util.h +2 -2
  40. data/lib/nmatrix.rb +13 -35
  41. data/lib/nmatrix/blas.rb +182 -56
  42. data/lib/nmatrix/io/market.rb +38 -14
  43. data/lib/nmatrix/io/mat5_reader.rb +393 -278
  44. data/lib/nmatrix/io/mat_reader.rb +121 -107
  45. data/lib/nmatrix/lapack.rb +59 -14
  46. data/lib/nmatrix/monkeys.rb +32 -30
  47. data/lib/nmatrix/nmatrix.rb +204 -100
  48. data/lib/nmatrix/nvector.rb +166 -57
  49. data/lib/nmatrix/shortcuts.rb +364 -231
  50. data/lib/nmatrix/version.rb +8 -4
  51. data/nmatrix.gemspec +5 -3
  52. data/scripts/mac-brew-gcc.sh +1 -1
  53. data/spec/blas_spec.rb +80 -2
  54. data/spec/math_spec.rb +78 -32
  55. data/spec/nmatrix_list_spec.rb +55 -55
  56. data/spec/nmatrix_spec.rb +60 -117
  57. data/spec/nmatrix_yale_resize_test_associations.yaml +2802 -0
  58. data/spec/nmatrix_yale_spec.rb +214 -198
  59. data/spec/nvector_spec.rb +58 -2
  60. data/spec/shortcuts_spec.rb +156 -32
  61. data/spec/slice_spec.rb +229 -178
  62. data/spec/spec_helper.rb +2 -2
  63. metadata +71 -21
@@ -28,230 +28,246 @@ require "./lib/nmatrix"
28
28
 
29
29
  describe NMatrix do
30
30
  context :yale do
31
- it "calculates itype" do
32
- NMatrix.itype_by_shape([4,4]).should == :uint8
33
- NMatrix.itype_by_shape(4).should == :uint8
34
- ## FIXME: Check larger shapes for correct itype
35
- end
31
+ it "calculates itype" do
32
+ NMatrix.itype_by_shape([4,4]).should == :uint8
33
+ NMatrix.itype_by_shape(4).should == :uint8
34
+ ## FIXME: Check larger shapes for correct itype
35
+ end
36
36
 
37
- it "compares two empty matrices" do
38
- n = NMatrix.new(:yale, [4,4], :float64)
39
- m = NMatrix.new(:yale, [4,4], :float64)
40
- n.should == m
41
- end
37
+ it "compares two empty matrices" do
38
+ n = NMatrix.new(:yale, [4,4], :float64)
39
+ m = NMatrix.new(:yale, [4,4], :float64)
40
+ n.should == m
41
+ end
42
42
 
43
- it "compares two matrices following basic assignments" do
44
- n = NMatrix.new(:yale, [2,2], :float64)
45
- m = NMatrix.new(:yale, [2,2], :float64)
46
- m[0,0] = 1
47
- m[0,1] = 1
48
- n.should_not == m
49
- n[0,0] = 1
50
- n.should_not == m
51
- n[0,1] = 1
52
- n.should == m
53
- end
43
+ it "compares two matrices following basic assignments" do
44
+ n = NMatrix.new(:yale, [2,2], :float64)
45
+ m = NMatrix.new(:yale, [2,2], :float64)
46
+ m[0,0] = 1
47
+ m[0,1] = 1
48
+ n.should_not == m
49
+ n[0,0] = 1
50
+ n.should_not == m
51
+ n[0,1] = 1
52
+ n.should == m
53
+ end
54
54
 
55
- it "compares two matrices following elementwise operations" do
56
- n = NMatrix.new(:yale, [2,2], :float64)
57
- n[0,1] = 1
58
- m = NMatrix.new(:yale, [2,2], :float64)
59
- m[0,1] = -1
60
- r = NMatrix.new(:yale, [2,2], :float64)
61
- r[0,1] = 0
62
- (n+m).should == r
63
- end
55
+ it "compares two matrices following elementwise operations" do
56
+ n = NMatrix.new(:yale, [2,2], :float64)
57
+ n[0,1] = 1
58
+ m = NMatrix.new(:yale, [2,2], :float64)
59
+ m[0,1] = -1
60
+ r = NMatrix.new(:yale, [2,2], :float64)
61
+ r[0,1] = 0
62
+ (n+m).should == r
63
+ end
64
64
 
65
- it "sets diagonal values" do
66
- n = NMatrix.new(:yale, [2,3], :float64)
67
- n.extend(NMatrix::YaleFunctions)
68
- n[1,1] = 0.1
69
- n[0,0] = 0.2
70
- n.yale_d.should == [0.2, 0.1]
71
- end
65
+ it "sets diagonal values" do
66
+ n = NMatrix.new(:yale, [2,3], :float64)
67
+ n.extend(NMatrix::YaleFunctions)
68
+ n[1,1] = 0.1
69
+ n[0,0] = 0.2
70
+ n.yale_d.should == [0.2, 0.1]
71
+ end
72
72
 
73
- it "does not resize until necessary" do
74
- n = NMatrix.new(:yale, [2,3], :float64)
75
- n.extend(NMatrix::YaleFunctions)
76
- n.yale_size.should == 3
77
- n.capacity.should == 5
78
- n[0,0] = 0.1
79
- n[0,1] = 0.2
80
- n[1,0] = 0.3
81
- n.yale_size.should == 5
82
- n.capacity.should == 5
83
- end
73
+ it "does not resize until necessary" do
74
+ n = NMatrix.new(:yale, [2,3], :float64)
75
+ n.extend(NMatrix::YaleFunctions)
76
+ n.yale_size.should == 3
77
+ n.capacity.should == 5
78
+ n[0,0] = 0.1
79
+ n[0,1] = 0.2
80
+ n[1,0] = 0.3
81
+ n.yale_size.should == 5
82
+ n.capacity.should == 5
83
+ end
84
84
 
85
85
 
86
- it "sets when not resizing" do
87
- n = NMatrix.new(:yale, [2,3], :float64)
88
- n.extend(NMatrix::YaleFunctions)
89
- n[0,0] = 0.1
90
- n[0,1] = 0.2
91
- n[1,0] = 0.3
92
- n.yale_a == [0.1, 0.0, 0.0, 0.2, 0.3]
93
- n.yale_ija == [3,4,5,1,0]
94
- end
86
+ it "sets when not resizing" do
87
+ n = NMatrix.new(:yale, [2,3], :float64)
88
+ n.extend(NMatrix::YaleFunctions)
89
+ n[0,0] = 0.1
90
+ n[0,1] = 0.2
91
+ n[1,0] = 0.3
92
+ n.yale_a == [0.1, 0.0, 0.0, 0.2, 0.3]
93
+ n.yale_ija == [3,4,5,1,0]
94
+ end
95
95
 
96
- it "sets when resizing" do
97
- n = NMatrix.new(:yale, [2,3], :float64)
98
- n.extend(NMatrix::YaleFunctions)
99
- n[0,0] = 0.01
100
- n[1,1] = 0.1
101
- n[0,1] = 0.2
102
- n[1,0] = 0.3
103
- n[1,2] = 0.4
104
- n.yale_d.should == [0.01, 0.1]
105
- n.yale_ia.should == [3,4,6]
106
- n.yale_ja.should == [1,0,2,nil]
107
- n.yale_lu.should == [0.2, 0.3, 0.4, nil]
108
- end
96
+ it "sets when resizing" do
97
+ n = NMatrix.new(:yale, [2,3], :float64)
98
+ n.extend(NMatrix::YaleFunctions)
99
+ n[0,0] = 0.01
100
+ n[1,1] = 0.1
101
+ n[0,1] = 0.2
102
+ n[1,0] = 0.3
103
+ n[1,2] = 0.4
104
+ n.yale_d.should == [0.01, 0.1]
105
+ n.yale_ia.should == [3,4,6]
106
+ n.yale_ja.should == [1,0,2,nil]
107
+ n.yale_lu.should == [0.2, 0.3, 0.4, nil]
108
+ end
109
109
 
110
- it "sets values within rows" do
111
- n = NMatrix.new(:yale, [3,20], :float64)
112
- n.extend(NMatrix::YaleFunctions)
113
- n[2,1] = 1.0
114
- n[2,0] = 1.5
115
- n[2,15] = 2.0
116
- n.yale_lu.should == [1.5, 1.0, 2.0]
117
- n.yale_ja.should == [0, 1, 15]
118
- end
110
+ it "resizes without erasing values" do
111
+ require 'yaml'
119
112
 
120
- it "gets values within rows" do
121
- n = NMatrix.new(:yale, [3,20], :float64)
122
- n[2,1] = 1.0
123
- n[2,0] = 1.5
124
- n[2,15] = 2.0
125
- n[2,1].should == 1.0
126
- n[2,0].should == 1.5
127
- n[2,15].should == 2.0
128
- end
113
+ associations = File.open('spec/nmatrix_yale_resize_test_associations.yaml') { |y| YAML::load(y) }
129
114
 
130
- it "sets values within large rows" do
131
- n = NMatrix.new(:yale, [10,300], :float64)
132
- n.extend(NMatrix::YaleFunctions)
133
- n[5,1] = 1.0
134
- n[5,0] = 1.5
135
- n[5,15] = 2.0
136
- n[5,291] = 3.0
137
- n[5,292] = 4.0
138
- n[5,289] = 5.0
139
- n[5,290] = 6.0
140
- n[5,293] = 2.0
141
- n[5,299] = 7.0
142
- n[5,100] = 8.0
143
- n.yale_lu.should == [1.5, 1.0, 2.0, 8.0, 5.0, 6.0, 3.0, 4.0, 2.0, 7.0]
144
- n.yale_ja.should == [0, 1, 15, 100, 289, 290, 291, 292, 293, 299]
145
- end
115
+ n = NMatrix.new(:yale, [618, 2801], associations.size, :byte)
146
116
 
147
- it "gets values within large rows" do
148
- n = NMatrix.new(:yale, [10,300], :float64)
149
- n.extend(NMatrix::YaleFunctions)
150
- n[5,1] = 1.0
151
- n[5,0] = 1.5
152
- n[5,15] = 2.0
153
- n[5,291] = 3.0
154
- n[5,292] = 4.0
155
- n[5,289] = 5.0
156
- n[5,290] = 6.0
157
- n[5,293] = 2.0
158
- n[5,299] = 7.0
159
- n[5,100] = 8.0
117
+ associations.each_pair do |j,i|
118
+ n[i,j] = 1
119
+ n[i,j].should be(1), "Value at #{i},#{j} not inserted correctly!"
120
+ end
160
121
 
161
- n.yale_ja.each_index do |idx|
162
- j = n.yale_ja[idx]
163
- n[5,j].should == n.yale_lu[idx]
122
+ associations.each_pair do |j,i|
123
+ n[i,j].should be(1), "Value at #{i},#{j} erased during resize!"
124
+ end
164
125
  end
165
- end
166
126
 
167
- it "dots two identical matrices" do
168
- a = NMatrix.new(:yale, 4, :float64)
169
- a[0,1] = 4.0
170
- a[1,2] = 1.0
171
- a[1,3] = 1.0
172
- a[3,1] = 2.0
127
+ it "sets values within rows" do
128
+ n = NMatrix.new(:yale, [3,20], :float64)
129
+ n.extend(NMatrix::YaleFunctions)
130
+ n[2,1] = 1.0
131
+ n[2,0] = 1.5
132
+ n[2,15] = 2.0
133
+ n.yale_lu.should == [1.5, 1.0, 2.0]
134
+ n.yale_ja.should == [0, 1, 15]
135
+ end
173
136
 
174
- b = a.dup
175
- c = a.dot b
137
+ it "gets values within rows" do
138
+ n = NMatrix.new(:yale, [3,20], :float64)
139
+ n[2,1] = 1.0
140
+ n[2,0] = 1.5
141
+ n[2,15] = 2.0
142
+ n[2,1].should == 1.0
143
+ n[2,0].should == 1.5
144
+ n[2,15].should == 2.0
145
+ end
176
146
 
177
- c[0,0].should == 0.0
178
- c[0,1].should == 0.0
179
- c[0,2].should == 4.0
180
- c[0,3].should == 4.0
181
- c[1,0].should == 0.0
182
- c[1,1].should == 2.0
183
- c[1,2].should == 0.0
184
- c[1,3].should == 0.0
185
- c[2,0].should == 0.0
186
- c[2,1].should == 0.0
187
- c[2,2].should == 0.0
188
- c[2,3].should == 0.0
189
- c[3,0].should == 0.0
190
- c[3,1].should == 0.0
191
- c[3,2].should == 2.0
192
- c[3,3].should == 2.0
193
- end
147
+ it "sets values within large rows" do
148
+ n = NMatrix.new(:yale, [10,300], :float64)
149
+ n.extend(NMatrix::YaleFunctions)
150
+ n[5,1] = 1.0
151
+ n[5,0] = 1.5
152
+ n[5,15] = 2.0
153
+ n[5,291] = 3.0
154
+ n[5,292] = 4.0
155
+ n[5,289] = 5.0
156
+ n[5,290] = 6.0
157
+ n[5,293] = 2.0
158
+ n[5,299] = 7.0
159
+ n[5,100] = 8.0
160
+ n.yale_lu.should == [1.5, 1.0, 2.0, 8.0, 5.0, 6.0, 3.0, 4.0, 2.0, 7.0]
161
+ n.yale_ja.should == [0, 1, 15, 100, 289, 290, 291, 292, 293, 299]
162
+ end
194
163
 
195
- it "dots two identical matrices where a positive and negative partial sum cancel on the diagonal" do
196
- a = NMatrix.new(:yale, 4, :float64)
164
+ it "gets values within large rows" do
165
+ n = NMatrix.new(:yale, [10,300], :float64)
166
+ n.extend(NMatrix::YaleFunctions)
167
+ n[5,1] = 1.0
168
+ n[5,0] = 1.5
169
+ n[5,15] = 2.0
170
+ n[5,291] = 3.0
171
+ n[5,292] = 4.0
172
+ n[5,289] = 5.0
173
+ n[5,290] = 6.0
174
+ n[5,293] = 2.0
175
+ n[5,299] = 7.0
176
+ n[5,100] = 8.0
197
177
 
198
- a[0,0] = 1.0
199
- a[0,1] = 4.0
200
- a[1,2] = 2.0
201
- a[1,3] = -4.0
202
- a[3,1] = 4.0
203
- a[3,3] = 4.0
178
+ n.yale_ja.each_index do |idx|
179
+ j = n.yale_ja[idx]
180
+ n[5,j].should == n.yale_lu[idx]
181
+ end
182
+ end
204
183
 
205
- b = a.dup
206
- c = a.dot b
184
+ it "dots two identical matrices" do
185
+ a = NMatrix.new(:yale, 4, :float64)
186
+ a[0,1] = 4.0
187
+ a[1,2] = 1.0
188
+ a[1,3] = 1.0
189
+ a[3,1] = 2.0
207
190
 
208
- #c[0,0].should == 1.0
209
- #c[0,1].should == 4.0
210
- #c[0,2].should == 8.0
211
- #c[0,3].should == -16.0
212
- #c[1,0].should == 0.0
213
- #c[1,1].should == -16.0
214
- #c[1,2].should == 0.0
215
- #c[1,3].should == -16.0
216
- #c[2,0].should == 0.0
217
- #c[2,1].should == 0.0
218
- #c[2,2].should == 0.0
219
- #c[2,3].should == 0.0
220
- #c[3,0].should == 0.0
221
- #c[3,1].should == 0.0
222
- #c[3,2].should == 8.0
223
- #c[3,3].should == 0.0 # this is the positive and negative partial sum cancel
191
+ b = a.dup
192
+ c = a.dot b
224
193
 
225
- c.extend(NMatrix::YaleFunctions)
194
+ c[0,0].should == 0.0
195
+ c[0,1].should == 0.0
196
+ c[0,2].should == 4.0
197
+ c[0,3].should == 4.0
198
+ c[1,0].should == 0.0
199
+ c[1,1].should == 2.0
200
+ c[1,2].should == 0.0
201
+ c[1,3].should == 0.0
202
+ c[2,0].should == 0.0
203
+ c[2,1].should == 0.0
204
+ c[2,2].should == 0.0
205
+ c[2,3].should == 0.0
206
+ c[3,0].should == 0.0
207
+ c[3,1].should == 0.0
208
+ c[3,2].should == 2.0
209
+ c[3,3].should == 2.0
210
+ end
226
211
 
227
- c.yale_ija.reject { |i| i.nil? }.should == [5,8,9,9,11,1,2,3,3,1,2]
228
- c.yale_a.reject { |i| i.nil? }.should == [1.0, -16.0, 0.0, 0.0, 0.0, 4.0, 8.0, -16.0, -16.0, 16.0, 8.0]
212
+ it "dots two identical matrices where a positive and negative partial sum cancel on the diagonal" do
213
+ a = NMatrix.new(:yale, 4, :float64)
229
214
 
230
- end
215
+ a[0,0] = 1.0
216
+ a[0,1] = 4.0
217
+ a[1,2] = 2.0
218
+ a[1,3] = -4.0
219
+ a[3,1] = 4.0
220
+ a[3,3] = 4.0
231
221
 
232
- it "transposes" do
233
- a = NMatrix.new(:yale, 4, :float64)
234
- a[0,0] = 1.0
235
- a[0,1] = 4.0
236
- a[1,2] = 2.0
237
- a[1,3] = -4.0
238
- a[3,1] = 5.0
239
- a[3,3] = 6.0
240
- b = a.transpose
222
+ b = a.dup
223
+ c = a.dot b
241
224
 
242
- b[0,0].should == 1.0
243
- b[1,0].should == 4.0
244
- b[2,0].should == 0.0
245
- b[3,0].should == 0.0
246
- b[0,1].should == 0.0
247
- b[1,1].should == 0.0
248
- b[2,1].should == 2.0
249
- b[3,1].should == -4.0
250
- b[0,3].should == 0.0
251
- b[1,3].should == 5.0
252
- b[2,3].should == 0.0
253
- b[3,3].should == 6.0
254
- end
225
+ #c[0,0].should == 1.0
226
+ #c[0,1].should == 4.0
227
+ #c[0,2].should == 8.0
228
+ #c[0,3].should == -16.0
229
+ #c[1,0].should == 0.0
230
+ #c[1,1].should == -16.0
231
+ #c[1,2].should == 0.0
232
+ #c[1,3].should == -16.0
233
+ #c[2,0].should == 0.0
234
+ #c[2,1].should == 0.0
235
+ #c[2,2].should == 0.0
236
+ #c[2,3].should == 0.0
237
+ #c[3,0].should == 0.0
238
+ #c[3,1].should == 0.0
239
+ #c[3,2].should == 8.0
240
+ #c[3,3].should == 0.0 # this is the positive and negative partial sum cancel
241
+
242
+ c.extend(NMatrix::YaleFunctions)
243
+
244
+ c.yale_ija.reject { |i| i.nil? }.should == [5,8,9,9,11,1,2,3,3,1,2]
245
+ c.yale_a.reject { |i| i.nil? }.should == [1.0, -16.0, 0.0, 0.0, 0.0, 4.0, 8.0, -16.0, -16.0, 16.0, 8.0]
255
246
 
247
+ end
248
+
249
+ it "transposes" do
250
+ a = NMatrix.new(:yale, 4, :float64)
251
+ a[0,0] = 1.0
252
+ a[0,1] = 4.0
253
+ a[1,2] = 2.0
254
+ a[1,3] = -4.0
255
+ a[3,1] = 5.0
256
+ a[3,3] = 6.0
257
+ b = a.transpose
258
+
259
+ b[0,0].should == 1.0
260
+ b[1,0].should == 4.0
261
+ b[2,0].should == 0.0
262
+ b[3,0].should == 0.0
263
+ b[0,1].should == 0.0
264
+ b[1,1].should == 0.0
265
+ b[2,1].should == 2.0
266
+ b[3,1].should == -4.0
267
+ b[0,3].should == 0.0
268
+ b[1,3].should == 5.0
269
+ b[2,3].should == 0.0
270
+ b[3,3].should == 6.0
271
+ end
256
272
  end
257
273
  end
@@ -29,15 +29,71 @@ require "./lib/nmatrix"
29
29
 
30
30
  describe NVector do
31
31
  it "initializes" do
32
- v = NVector.new 5, :float64
32
+ v = NVector.new(5, 0, :float64)
33
33
  v.shape[0].should == 5
34
34
  v.shape[1].should == 1
35
35
  end
36
36
 
37
37
  it "permits setting and getting contents" do
38
+ v = NVector.new(5, 0, :float64)
39
+ v[0] = 1.555
40
+ v[0].should == 1.555
41
+ end
42
+
43
+ it "transpose() changes raw and column stored structure" do
38
44
  v = NVector.new 5, :float64
45
+ v = v.transpose
46
+ v.shape[0].should == 1
47
+ v.shape[1].should == 5
39
48
  v[0] = 1.555
40
49
  v[0].should == 1.555
41
50
  end
42
51
 
43
- end
52
+ it "transpose!() changes destructively its raw and column stored structure" do
53
+ v = NVector.new 5, :float64
54
+ v.transpose!
55
+ v.shape[0].should == 1
56
+ v.shape[1].should == 5
57
+ end
58
+
59
+ it "multiply() multiples itself by another NVector" do
60
+ v1 = NVector.new 2, :float64
61
+ v2 = NVector.new 2, :float64
62
+ v1[0] = 1.5
63
+ v1[1] = 2.3
64
+ v2[0] = 1.3
65
+ v2[1] = 2.5
66
+ v1.multiply(v2).should == 12.0
67
+ end
68
+
69
+ it "multiply!() multiples destructively itself by another NVector" do
70
+ v1 = NVector.new 2, :float64
71
+ v2 = NVector.new 2, :float64
72
+ v1[0] = 1.5
73
+ v1[1] = 2.3
74
+ v2[0] = 1.3
75
+ v2[1] = 2.5
76
+ v1.multiply!(v2)
77
+ v1.should == 12.0
78
+ end
79
+
80
+ it "pretty_print() prints values to standard output with a pretty format" do
81
+ pending "pretty_print formatting is finalized"
82
+ v = NVector.new(5, 0)
83
+ $stdout = StringIO.new
84
+ v.pretty_print
85
+ out = $stdout.string
86
+ $stdout = STDOUT
87
+ out.should == "0 0 0 0 0\n"
88
+ end
89
+
90
+ it "inspect() formats the output with inspected, namely human readable format" do
91
+ pending "inspect output is finalized"
92
+ v = NVector.new(5, 0)
93
+ $stdout = StringIO.new
94
+ p v
95
+ out = $stdout.string
96
+ $stdout = STDOUT
97
+ out.should == "0 0 0 0 0\n"
98
+ end
99
+ end