ruby-gsl-ng 0.2.4.1 → 0.2.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.
- data/History.txt +13 -0
- data/Manifest +2 -1
- data/Rakefile +1 -1
- data/ext/extconf.rb +6 -0
- data/ext/gslng_extensions.cpp +70 -15
- data/ext/plotting.cpp +14 -1
- data/lib/core_extensions/array.rb +14 -0
- data/lib/gslng.rb +2 -0
- data/lib/gslng/backend_components/matrix.rb +3 -0
- data/lib/gslng/backend_components/stats.rb +1 -0
- data/lib/gslng/matrix.rb +65 -50
- data/lib/gslng/matrix_view.rb +2 -0
- data/lib/gslng/plotter.rb +6 -2
- data/lib/gslng/vector.rb +112 -87
- data/lib/gslng/vector_view.rb +3 -1
- data/ruby-gsl-ng.gemspec +4 -4
- data/test/benchmark_results +53 -41
- data/test/matrix_test.rb +9 -0
- data/test/test_gsl.rb +2 -1
- data/test/vector_test.rb +17 -4
- metadata +6 -5
data/lib/gslng/matrix_view.rb
CHANGED
@@ -14,8 +14,10 @@ module GSLng
|
|
14
14
|
@owner = owner
|
15
15
|
@m,@n = m,n
|
16
16
|
|
17
|
+
@backend = GSLng.backend
|
17
18
|
ptr = GSLng.backend::gsl_matrix_submatrix2(owner.ptr, x, y, m, n)
|
18
19
|
@ptr = FFI::AutoPointer.new(ptr, View.method(:release))
|
20
|
+
@ptr_value = @ptr.to_i
|
19
21
|
end
|
20
22
|
|
21
23
|
def View.release(ptr)
|
data/lib/gslng/plotter.rb
CHANGED
@@ -27,8 +27,12 @@ module GSLng
|
|
27
27
|
# Close the pipe. It is desireable to call this in an "ensure" section, to avoid
|
28
28
|
# leaving the child gnuplot process there if the main ruby process dies
|
29
29
|
def close
|
30
|
-
|
31
|
-
@io.close; @io = nil
|
30
|
+
pid = @io.pid
|
31
|
+
@io.flush; @io.close; @io = nil
|
32
|
+
begin
|
33
|
+
Process.kill 'TERM', pid
|
34
|
+
rescue Errno::ESRCH
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
38
|
# Send a command to the gnuplot process
|
data/lib/gslng/vector.rb
CHANGED
@@ -16,6 +16,7 @@ module GSLng
|
|
16
16
|
|
17
17
|
attr_reader :size, :stride
|
18
18
|
attr_reader :ptr # @private
|
19
|
+
attr_reader :ptr_value # @private
|
19
20
|
|
20
21
|
# @group Constructors
|
21
22
|
|
@@ -23,19 +24,23 @@ module GSLng
|
|
23
24
|
# Otherwise, the vector will contain garbage.
|
24
25
|
# You can optionally pass a block, in which case {#map_index!} will be called with it (i.e.: it works like {Array.new}).
|
25
26
|
def initialize(n, zero = false)
|
26
|
-
|
27
|
+
@backend = GSLng.backend
|
28
|
+
ptr = (zero ? @backend.gsl_vector_calloc(n) : @backend.gsl_vector_alloc(n))
|
27
29
|
@ptr = FFI::AutoPointer.new(ptr, Vector.method(:release))
|
30
|
+
@ptr_value = @ptr.to_i
|
28
31
|
@size = n
|
29
32
|
@stride = 1
|
30
33
|
if (block_given?) then self.map_index!(Proc.new) end
|
31
34
|
end
|
32
35
|
|
33
36
|
def initialize_copy(other) # @private
|
34
|
-
|
37
|
+
@backend = GSLng.backend
|
38
|
+
ptr = @backend.gsl_vector_alloc(other.size)
|
35
39
|
@ptr = FFI::AutoPointer.new(ptr, Vector.method(:release))
|
40
|
+
@ptr_value = @ptr.to_i
|
36
41
|
@size = other.size
|
37
42
|
@stride = 1
|
38
|
-
|
43
|
+
@backend.gsl_vector_memcpy(@ptr, other.ptr)
|
39
44
|
end
|
40
45
|
|
41
46
|
def Vector.release(ptr) # @private
|
@@ -49,10 +54,16 @@ module GSLng
|
|
49
54
|
def Vector.from_array(array)
|
50
55
|
if (array.empty?) then raise "Can't create empty vector" end
|
51
56
|
v = Vector.new(array.size)
|
52
|
-
GSLng.backend.gsl_vector_from_array(v.
|
57
|
+
GSLng.backend.gsl_vector_from_array(v.ptr_value, array)
|
53
58
|
return v
|
54
59
|
end
|
55
60
|
|
61
|
+
# Creates a Vector with linearly distributed values between +start+ and +stop+, separated by +delta+.
|
62
|
+
def Vector.linspace(start, stop, delta)
|
63
|
+
if (start > stop || delta <= 0) then raise 'Invalid values' end
|
64
|
+
Vector.new(((stop - start) / delta).floor.to_i + 1) {|i| start + delta * i}
|
65
|
+
end
|
66
|
+
|
56
67
|
# Creates a Vector from an Array or a Range
|
57
68
|
# @see Vector::from_array
|
58
69
|
# @example
|
@@ -76,8 +87,8 @@ module GSLng
|
|
76
87
|
# @return [Vector] self
|
77
88
|
def add!(other)
|
78
89
|
case other
|
79
|
-
when Numeric;
|
80
|
-
when Vector;
|
90
|
+
when Numeric; @backend.gsl_vector_add_constant(@ptr, other.to_f)
|
91
|
+
when Vector; @backend.gsl_vector_add(@ptr, other.ptr)
|
81
92
|
else
|
82
93
|
x,y = other.coerce(self)
|
83
94
|
x.add!(y)
|
@@ -89,8 +100,8 @@ module GSLng
|
|
89
100
|
# @return [Vector] self
|
90
101
|
def substract!(other)
|
91
102
|
case other
|
92
|
-
when Numeric;
|
93
|
-
when Vector;
|
103
|
+
when Numeric; @backend.gsl_vector_add_constant(@ptr, -other.to_f)
|
104
|
+
when Vector; @backend.gsl_vector_sub(@ptr, other.ptr)
|
94
105
|
else
|
95
106
|
x,y = other.coerce(self)
|
96
107
|
x.sub!(y)
|
@@ -103,8 +114,8 @@ module GSLng
|
|
103
114
|
# @return [Vector] self
|
104
115
|
def multiply!(other)
|
105
116
|
case other
|
106
|
-
when Numeric;
|
107
|
-
when Vector;
|
117
|
+
when Numeric; @backend.gsl_blas_dscal(other.to_f, @ptr)
|
118
|
+
when Vector; @backend.gsl_vector_mul(@ptr, other.ptr)
|
108
119
|
else
|
109
120
|
x,y = other.coerce(self)
|
110
121
|
x.mul!(y)
|
@@ -117,8 +128,8 @@ module GSLng
|
|
117
128
|
# @return [Vector] self
|
118
129
|
def divide!(other)
|
119
130
|
case other
|
120
|
-
when Numeric;
|
121
|
-
when Vector;
|
131
|
+
when Numeric; @backend.gsl_blas_dscal(1.0 / other, @ptr)
|
132
|
+
when Vector; @backend.gsl_vector_div(@ptr, other.ptr)
|
122
133
|
else
|
123
134
|
x,y = other.coerce(self)
|
124
135
|
x.div!(y)
|
@@ -161,57 +172,57 @@ module GSLng
|
|
161
172
|
# Vector[1,2,3] ^ Vector[0,1,2] => 8.0
|
162
173
|
def dot(other)
|
163
174
|
out = FFI::Buffer.new(:double)
|
164
|
-
|
175
|
+
@backend.gsl_blas_ddot(@ptr, other.ptr, out)
|
165
176
|
return out[0].get_double(0)
|
166
177
|
end
|
167
178
|
alias_method :^, :dot
|
168
179
|
|
169
180
|
# Norm 2 of the vector (uses BLAS's dnrm2)
|
170
|
-
def norm;
|
181
|
+
def norm; @backend.gsl_blas_dnrm2(@ptr) end
|
171
182
|
alias_method :length, :norm
|
172
183
|
|
173
184
|
# Returns the sum of all elements (uses BLAS's dasum)
|
174
|
-
def sum;
|
185
|
+
def sum; @backend.gsl_blas_dasum(@ptr) end
|
175
186
|
|
176
187
|
# Optimized version of: self += other * alpha (where alpha is a Numeric). Uses BLAS's daxpy.
|
177
|
-
def mul_add(other, alpha);
|
188
|
+
def mul_add(other, alpha); @backend.gsl_blas_daxpy(alpha, other.ptr, @ptr); return self end
|
178
189
|
|
179
190
|
# @group Miscelaneous methods
|
180
191
|
|
181
192
|
# Reverse the order of elements
|
182
|
-
def reverse!;
|
193
|
+
def reverse!; @backend.gsl_vector_reverse(@ptr); return self end
|
183
194
|
|
184
195
|
# Swap the i-th element with the j-th element
|
185
|
-
def swap(i,j);
|
196
|
+
def swap(i,j); @backend.gsl_vector_swap_elements(@ptr, i, j); return self end
|
186
197
|
|
187
|
-
def sort!;
|
198
|
+
def sort!; @backend.gsl_sort_vector(@ptr); return self end
|
188
199
|
def sort; self.dup.sort! end
|
189
200
|
|
190
201
|
# Copy other's values into self
|
191
|
-
def copy(other);
|
202
|
+
def copy(other); @backend.gsl_vector_memcpy(@ptr, other.ptr); return self end
|
192
203
|
|
193
|
-
# Wraps self into the interval [
|
194
|
-
#
|
195
|
-
# @param [Vector,Numeric] min
|
196
|
-
# @param [Vector,Numeric] max
|
204
|
+
# Wraps self into the interval [0,up_to). NOTE: this value must be > 0
|
205
|
+
# @param [Vector,Numeric] up_to
|
197
206
|
# @return [Vector] a vector of values -1, 1 or 0, if (max-min) was substracted, added to the coordinate,
|
198
207
|
# or not modified, respectively.
|
199
208
|
# @example Assuming that +v = Vector[-8,2,8]+
|
200
|
-
# v.wrap(
|
209
|
+
# v.wrap(5) => [1.0 0.0 -1.0]:Vector
|
201
210
|
# v => [-3.0 2.0 3.0]:Vector
|
202
|
-
def wrap!(
|
203
|
-
min,other = self.coerce(min)
|
204
|
-
max,other = self.coerce(max)
|
211
|
+
def wrap!(up_to)
|
205
212
|
delta = Vector.new(self.size)
|
206
|
-
range = max - min
|
207
|
-
|
208
213
|
self.map_index! do |i|
|
209
|
-
|
210
|
-
|
211
|
-
|
214
|
+
a,b = self[i].divmod(up_to)
|
215
|
+
delta[i] = -a
|
216
|
+
b
|
212
217
|
end
|
213
218
|
return delta
|
214
219
|
end
|
220
|
+
|
221
|
+
# Compute hash value for this Vector.
|
222
|
+
# Note: this may be a bit inefficient for now
|
223
|
+
def hash
|
224
|
+
self.to_a.hash
|
225
|
+
end
|
215
226
|
|
216
227
|
# @group Setting/getting values
|
217
228
|
|
@@ -220,7 +231,7 @@ module GSLng
|
|
220
231
|
# @raise [RuntimeError] if out-of-bounds
|
221
232
|
# @todo support ranges
|
222
233
|
def [](index)
|
223
|
-
|
234
|
+
@backend.gsl_vector_get_operator(@ptr_value, index)
|
224
235
|
end
|
225
236
|
|
226
237
|
# Set the i-th element.
|
@@ -228,7 +239,8 @@ module GSLng
|
|
228
239
|
# @raise [RuntimeError] if out-of-bounds
|
229
240
|
# @todo support ranges
|
230
241
|
def []=(index, value)
|
231
|
-
|
242
|
+
@backend.gsl_vector_set_operator(@ptr_value, index, value.to_f)
|
243
|
+
#@backend.gsl_vector_set(@ptr, (index < 0 ? @size + index : index), value.to_f)
|
232
244
|
end
|
233
245
|
|
234
246
|
# @group Views
|
@@ -244,8 +256,8 @@ module GSLng
|
|
244
256
|
size = k + (m == 0 ? 0 : 1)
|
245
257
|
end
|
246
258
|
|
247
|
-
if (stride == 1) then ptr =
|
248
|
-
else ptr =
|
259
|
+
if (stride == 1) then ptr = @backend.gsl_vector_subvector2(@ptr, offset, size)
|
260
|
+
else ptr = @backend.gsl_vector_subvector_with_stride2(@ptr, offset, stride, size) end
|
249
261
|
View.new(ptr, self, size, stride)
|
250
262
|
end
|
251
263
|
alias_method :subvector_view, :view
|
@@ -254,49 +266,49 @@ module GSLng
|
|
254
266
|
def subvector(*args); subvector_view(*args).to_vector end
|
255
267
|
|
256
268
|
# Set all values to v
|
257
|
-
def all!(v);
|
269
|
+
def all!(v); @backend.gsl_vector_set_all(@ptr, v); return self end
|
258
270
|
alias_method :set!, :all!
|
259
271
|
alias_method :fill!, :all!
|
260
272
|
|
261
273
|
# Set all values to zero
|
262
|
-
def zero!;
|
274
|
+
def zero!; @backend.gsl_vector_set_zero(@ptr); return self end
|
263
275
|
|
264
276
|
# Set all values to zero, except the i-th element, which is set to 1
|
265
|
-
def basis!(i);
|
277
|
+
def basis!(i); @backend.gsl_vector_set_basis(@ptr, i); return self end
|
266
278
|
|
267
279
|
# @group 2D/3D/4D utility vectors
|
268
280
|
|
269
281
|
# Same as Vector#[0]
|
270
|
-
def x;
|
282
|
+
def x; @backend.gsl_vector_get(@ptr, 0) end
|
271
283
|
# Same as Vector#[1]
|
272
|
-
def y;
|
284
|
+
def y; @backend.gsl_vector_get(@ptr, 1) end
|
273
285
|
# Same as Vector#[2]
|
274
|
-
def z;
|
286
|
+
def z; @backend.gsl_vector_get(@ptr, 2) end
|
275
287
|
# Same as Vector#[3]
|
276
|
-
def w;
|
288
|
+
def w; @backend.gsl_vector_get(@ptr, 3) end
|
277
289
|
|
278
290
|
# Same as Vector#[0]=
|
279
|
-
def x=(v);
|
291
|
+
def x=(v); @backend.gsl_vector_set(@ptr, 0, v.to_f) end
|
280
292
|
# Same as Vector#[1]=
|
281
|
-
def y=(v);
|
293
|
+
def y=(v); @backend.gsl_vector_set(@ptr, 1, v.to_f) end
|
282
294
|
# Same as Vector#[2]=
|
283
|
-
def z=(v);
|
295
|
+
def z=(v); @backend.gsl_vector_set(@ptr, 2, v.to_f) end
|
284
296
|
# Same as Vector#[3]=
|
285
|
-
def w=(v);
|
297
|
+
def w=(v); @backend.gsl_vector_set(@ptr, 3, v.to_f) end
|
286
298
|
|
287
299
|
# @group Predicate methods
|
288
300
|
|
289
301
|
# if all elements are zero
|
290
|
-
def zero?;
|
302
|
+
def zero?; @backend.gsl_vector_isnull(@ptr) == 1 ? true : false end
|
291
303
|
|
292
304
|
# if all elements are strictly positive (>0)
|
293
|
-
def positive?;
|
305
|
+
def positive?; @backend.gsl_vector_ispos(@ptr) == 1 ? true : false end
|
294
306
|
|
295
307
|
#if all elements are strictly negative (<0)
|
296
|
-
def negative?;
|
308
|
+
def negative?; @backend.gsl_vector_isneg(@ptr) == 1 ? true : false end
|
297
309
|
|
298
310
|
# if all elements are non-negative (>=0)
|
299
|
-
def nonnegative?;
|
311
|
+
def nonnegative?; @backend.gsl_vector_isnonneg(@ptr) == 1 ? true : false end
|
300
312
|
|
301
313
|
# If each element of self is less than other's elements
|
302
314
|
def <(other); (other - self).positive? end
|
@@ -313,16 +325,16 @@ module GSLng
|
|
313
325
|
# @group Minimum/Maximum
|
314
326
|
|
315
327
|
# Return maximum element of vector
|
316
|
-
def max;
|
328
|
+
def max; @backend.gsl_vector_max(@ptr) end
|
317
329
|
|
318
330
|
# Return minimum element of vector
|
319
|
-
def min;
|
331
|
+
def min; @backend.gsl_vector_min(@ptr) end
|
320
332
|
|
321
333
|
# Same as {Array#minmax}
|
322
334
|
def minmax
|
323
335
|
min = FFI::Buffer.new(:double)
|
324
336
|
max = FFI::Buffer.new(:double)
|
325
|
-
|
337
|
+
@backend.gsl_vector_minmax(@ptr, min, max)
|
326
338
|
return [min[0].get_float64(0),max[0].get_float64(0)]
|
327
339
|
end
|
328
340
|
|
@@ -330,108 +342,117 @@ module GSLng
|
|
330
342
|
def minmax_index
|
331
343
|
min = FFI::Buffer.new(:size_t)
|
332
344
|
max = FFI::Buffer.new(:size_t)
|
333
|
-
|
345
|
+
@backend.gsl_vector_minmax_index(@ptr, min, max)
|
334
346
|
#return [min[0].get_size_t(0),max[0].get_size_t(0)]
|
335
347
|
return [min[0].get_ulong(0),max[0].get_ulong(0)]
|
336
348
|
end
|
337
349
|
|
338
350
|
# Same as {#min}, but returns the index to the element
|
339
|
-
def min_index;
|
351
|
+
def min_index; @backend.gsl_vector_min_index(@ptr) end
|
340
352
|
|
341
353
|
# Same as {#max}, but returns the index to the element
|
342
|
-
def max_index;
|
354
|
+
def max_index; @backend.gsl_vector_max_index(@ptr) end
|
343
355
|
|
344
356
|
# @group Statistics
|
345
357
|
|
346
358
|
# Compute the mean of the vector
|
347
|
-
def mean;
|
359
|
+
def mean; @backend.gsl_stats_mean(self.as_array, self.stride, self.size) end
|
348
360
|
|
361
|
+
# Compute the median of the vector
|
362
|
+
# *Note* it assumes sorted data!
|
363
|
+
def median; @backend.gsl_stats_median_from_sorted_data(self.as_array, self.stride, self.size) end
|
364
|
+
|
365
|
+
# Compute the median of the vector
|
366
|
+
# *Note* it assumes sorted data!
|
367
|
+
# @param [Float] f A number between 0 and 1 indicating the percentile
|
368
|
+
def quantile(f); @backend.gsl_stats_quantile_from_sorted_data(self.as_array, self.stride, self.size, f) end
|
369
|
+
|
349
370
|
# Compute the variance of the vector
|
350
371
|
# @param [Float] mean Optionally supply the mean if you already computed it previously with {self#mean}
|
351
372
|
# @param [Boolean] fixed_mean If true, the passed mean is taken to be known a priori (see GSL documentation)
|
352
373
|
def variance(mean = nil, fixed_mean = false)
|
353
|
-
if (mean.nil?) then
|
374
|
+
if (mean.nil?) then @backend.gsl_stats_variance(self.as_array, self.stride, self.size)
|
354
375
|
else
|
355
|
-
if (fixed_mean) then
|
356
|
-
else
|
376
|
+
if (fixed_mean) then @backend.gsl_stats_variance_with_fixed_mean(self.as_array, self.stride, self.size, mean)
|
377
|
+
else @backend.gsl_stats_variance_m(self.as_array, self.stride, self.size, mean) end
|
357
378
|
end
|
358
379
|
end
|
359
380
|
|
360
381
|
# Compute the standard deviation of the vector
|
361
382
|
# @see #variance
|
362
383
|
def standard_deviation(mean = nil, fixed_mean = false)
|
363
|
-
if (mean.nil?) then
|
384
|
+
if (mean.nil?) then @backend.gsl_stats_sd(self.as_array, self.stride, self.size)
|
364
385
|
else
|
365
|
-
if (fixed_mean) then
|
366
|
-
else
|
386
|
+
if (fixed_mean) then @backend.gsl_stats_sd_with_fixed_mean(self.as_array, self.stride, self.size, mean)
|
387
|
+
else @backend.gsl_stats_sd_m(self.as_array, self.stride, self.size, mean) end
|
367
388
|
end
|
368
389
|
end
|
369
390
|
|
370
391
|
# Compute the total sum of squares of the vector
|
371
392
|
# @see #variance
|
372
393
|
def total_sum_squares(mean = nil)
|
373
|
-
if (mean.nil?) then
|
374
|
-
else
|
394
|
+
if (mean.nil?) then @backend.gsl_stats_tss(self.as_array, self.stride, self.size)
|
395
|
+
else @backend.gsl_stats_tss_m(self.as_array, self.stride, self.size, mean) end
|
375
396
|
end
|
376
397
|
|
377
398
|
# Compute the absolute deviation of the vector
|
378
399
|
# @see #variance
|
379
400
|
def absolute_deviation(mean = nil)
|
380
|
-
if (mean.nil?) then
|
381
|
-
else
|
401
|
+
if (mean.nil?) then @backend.gsl_stats_absdev(self.as_array, self.stride, self.size)
|
402
|
+
else @backend.gsl_stats_absdev_m(self.as_array, self.stride, self.size, mean) end
|
382
403
|
end
|
383
404
|
|
384
|
-
# Compute the
|
405
|
+
# Compute the skewness of the vector. You can optionally provide the mean *and* the standard deviation if you already computed them
|
385
406
|
def skew(mean = nil, sd = nil)
|
386
|
-
if (mean.nil? || sd.nil?) then
|
387
|
-
else
|
407
|
+
if (mean.nil? || sd.nil?) then @backend.gsl_stats_skew(self.as_array, self.stride, self.size)
|
408
|
+
else @backend.gsl_stats_skew_sd_m(self.as_array, self.stride, self.size, mean, sd) end
|
388
409
|
end
|
389
410
|
|
390
411
|
# Compute the kurtosis of the vector
|
391
412
|
# @see #skew
|
392
413
|
def kurtosis(mean = nil, sd = nil)
|
393
|
-
if (mean.nil? || sd.nil?) then
|
394
|
-
else
|
414
|
+
if (mean.nil? || sd.nil?) then @backend.gsl_stats_kurtosis(self.as_array, self.stride, self.size)
|
415
|
+
else @backend.gsl_stats_kurtosis_sd_m(self.as_array, self.stride, self.size, mean, sd) end
|
395
416
|
end
|
396
417
|
|
397
418
|
# Compute the autocorrelation of the vector
|
398
419
|
# @see #variance
|
399
420
|
def autocorrelation(mean = nil)
|
400
|
-
if (mean.nil?) then
|
401
|
-
else
|
421
|
+
if (mean.nil?) then @backend.gsl_stats_lag1_autocorrelation(self.as_array, self.stride, self.size)
|
422
|
+
else @backend.gsl_stats_lag1_autocorrelation(self.as_array, self.stride, self.size, mean) end
|
402
423
|
end
|
403
424
|
|
404
425
|
# Compute the covariance between self and other. You can optionally pass the mean of both vectors if you already computed them
|
405
426
|
# @see #variance
|
406
427
|
def covariance(other, mean1 = nil, mean2 = nil)
|
407
|
-
if (mean1.nil? || mean2.nil?) then
|
408
|
-
else
|
428
|
+
if (mean1.nil? || mean2.nil?) then @backend.gsl_stats_covariance(self.as_array, self.stride, other.as_array, other.stride, self.size)
|
429
|
+
else @backend.gsl_stats_covariance(self.as_array, self.stride, other.as_array, other.stride, self.size, mean1, mean2) end
|
409
430
|
end
|
410
431
|
|
411
432
|
# Compute the correlation between self and other
|
412
433
|
def correlation(other)
|
413
|
-
|
434
|
+
@backend.gsl_stats_correlation(self.as_array, self.stride, other.as_array, other.stride, self.size)
|
414
435
|
end
|
415
436
|
|
416
437
|
# @group High-order methods
|
417
438
|
|
418
439
|
# @yield [elem]
|
419
440
|
def each(block = Proc.new)
|
420
|
-
|
441
|
+
@backend.gsl_vector_each(@ptr_value, &block)
|
421
442
|
end
|
422
443
|
|
423
444
|
# @see #each
|
424
445
|
# @yield [elem,i]
|
425
446
|
def each_with_index(block = Proc.new)
|
426
|
-
|
447
|
+
@backend.gsl_vector_each_with_index(@ptr_value, &block)
|
427
448
|
end
|
428
449
|
|
429
450
|
# @see #map
|
430
|
-
def map!(block = Proc.new);
|
451
|
+
def map!(block = Proc.new); @backend.gsl_vector_map!(@ptr_value, &block); return self end
|
431
452
|
|
432
453
|
# Similar to {#map!}, but passes the index to the element instead.
|
433
454
|
# @yield [i]
|
434
|
-
def map_index!(block = Proc.new);
|
455
|
+
def map_index!(block = Proc.new); @backend.gsl_vector_map_index!(@ptr_value, &block); return self end
|
435
456
|
|
436
457
|
# @return [Vector]
|
437
458
|
# @see #map_index!
|
@@ -489,18 +510,18 @@ module GSLng
|
|
489
510
|
|
490
511
|
# @return [Array]
|
491
512
|
def to_a
|
492
|
-
|
513
|
+
@backend.gsl_vector_to_a(@ptr_value)
|
493
514
|
end
|
494
515
|
|
495
516
|
def as_array # @private
|
496
|
-
|
517
|
+
@backend.gsl_vector_as_array(@ptr)
|
497
518
|
end
|
498
519
|
|
499
520
|
# Create a row matrix from this vector
|
500
521
|
# @return [Matrix]
|
501
522
|
def to_matrix
|
502
523
|
m = Matrix.new(1, @size)
|
503
|
-
|
524
|
+
@backend.gsl_matrix_set_row(m.ptr, 0, @ptr)
|
504
525
|
return m
|
505
526
|
end
|
506
527
|
alias_method :to_row, :to_matrix
|
@@ -509,7 +530,7 @@ module GSLng
|
|
509
530
|
# @return [Matrix]
|
510
531
|
def transpose
|
511
532
|
m = Matrix.new(@size, 1)
|
512
|
-
|
533
|
+
@backend.gsl_matrix_set_col(m.ptr, 0, @ptr)
|
513
534
|
return m
|
514
535
|
end
|
515
536
|
alias_method :to_column, :transpose
|
@@ -524,5 +545,9 @@ module GSLng
|
|
524
545
|
end
|
525
546
|
return true
|
526
547
|
end
|
548
|
+
|
549
|
+
def eql?(other)
|
550
|
+
@backend.gsl_vector_eql?(@ptr_value, other.ptr_value)
|
551
|
+
end
|
527
552
|
end
|
528
553
|
end
|