1 %module
"Math::GSL::Vector"
5 %apply int
*OUTPUT { size_t
*imin
, size_t
*imax
};
7 %apply double
*OUTPUT { double
* min_out
, double
* max_out
};
9 %typemap
(in
) double
*v
{
15 croak
("Math::GSL : $input is not a reference!");
16 if
(SvTYPE
(SvRV
($input
)) != SVt_PVAV
)
17 croak
("Math::GSL : $input is not an array ref!");
19 tempav
= (AV
*)SvRV
($input
);
21 $
1 = (double
*) malloc
((len
+1)*sizeof
(double
));
22 for
(i
= 0; i
<= len
; i
++) {
23 tv
= av_fetch
(tempav
, i
, 0);
24 $
1[i
] = (double
) SvNV
(*tv
);
28 FILE * fopen
(char
*, char
*);
32 #include
"gsl/gsl_nan.h"
33 #include
"gsl/gsl_vector.h"
34 #include
"gsl/gsl_vector_char.h"
35 #include
"gsl/gsl_vector_complex.h"
36 #include
"gsl/gsl_vector_complex_double.h"
37 #include
"gsl/gsl_vector_double.h"
38 #include
"gsl/gsl_vector_float.h"
39 #include
"gsl/gsl_vector_int.h"
42 %include
"gsl/gsl_nan.h"
43 %include
"gsl/gsl_vector.h"
44 %include
"gsl/gsl_vector_char.h"
45 %include
"gsl/gsl_vector_complex.h"
46 %include
"gsl/gsl_vector_complex_double.h"
47 %include
"gsl/gsl_vector_double.h"
48 %include
"gsl/gsl_vector_int.h"
53 use Scalar
::Util 'blessed'
;
56 '
*'
=> \
&_multiplication,
60 @EXPORT_OK
= qw
/fopen fclose
61 gsl_vector_alloc gsl_vector_calloc gsl_vector_alloc_from_block gsl_vector_alloc_from_vector
62 gsl_vector_free gsl_vector_view_array gsl_vector_view_array_with_stride
63 gsl_vector_const_view_array_with_stride gsl_vector_subvector gsl_vector_subvector_wi gsl_vector_subvector_with_stride
64 gsl_vector_const_subvec gsl_vector_const_subvec gsl_vector_get gsl_vector_set
65 gsl_vector_ptr gsl_vector_const_ptr gsl_vector_set_zero gsl_vector_set_all
66 gsl_vector_set_basis gsl_vector_fread gsl_vector_fwrite gsl_vector_fscanf
67 gsl_vector_fprintf gsl_vector_memcpy gsl_vector_reverse gsl_vector_swap
68 gsl_vector_swap_elements gsl_vector_max gsl_vector_min gsl_vector_minmax
69 gsl_vector_max_index gsl_vector_min_index gsl_vector_minmax_index
70 gsl_vector_add gsl_vector_sub gsl_vector_mul gsl_vector_div
71 gsl_vector_scale gsl_vector_add_constant gsl_vector_isnull
72 gsl_vector_ispos gsl_vector_isneg gsl_vector_isnonneg
73 gsl_vector_float_alloc gsl_vector_float_calloc gsl_vector_float_alloc_from_block
74 gsl_vector_float_alloc_from_vector gsl_vector_float_free gsl_vector_float_view_array
75 gsl_vector_float_view_array_with_stride gsl_vector_float_const_view_array gsl_vector_float_const_view_array_with_stride
76 gsl_vector_float_subvector gsl_vector_float_subvector_with_stride gsl_vector_float_const_subvector
77 gsl_vector_float_const_subvector_with_stride gsl_vector_float_get gsl_vector_float_set gsl_vector_float_ptr
78 gsl_vector_float_const_ptr gsl_vector_float_set_zero gsl_vector_float_set_all gsl_vector_float_set_basis
79 gsl_vector_float_fread gsl_vector_float_fwrite gsl_vector_float_fscanf gsl_vector_float_fprintf
80 gsl_vector_float_memcpy gsl_vector_float_reverse gsl_vector_float_swap gsl_vector_float_swap_elements
81 gsl_vector_float_max gsl_vector_float_min gsl_vector_float_minmax gsl_vector_float_max_index gsl_vector_float_min_index
82 gsl_vector_float_minmax_index gsl_vector_float_add gsl_vector_float_sub gsl_vector_float_mul gsl_vector_float_div gsl_vector_float_scale
83 gsl_vector_float_add_constant gsl_vector_float_isnull gsl_vector_float_ispos gsl_vector_float_isneg gsl_vector_float_isnonneg
84 gsl_vector_complex_alloc gsl_vector_complex_calloc gsl_vector_complex_alloc_from_block gsl_vector_complex_alloc_from_vector
85 gsl_vector_complex_free gsl_vector_complex_view_array gsl_vector_complex_view_array_with_stride gsl_vector_complex_const_view_array
86 gsl_vector_complex_const_view_array_with_stride gsl_vector_complex_subvector gsl_vector_complex_subvector_with_stride
87 gsl_vector_complex_const_subvector gsl_vector_complex_const_subvector_with_stride gsl_vector_complex_real gsl_vector_complex_imag
88 gsl_vector_complex_const_real gsl_vector_complex_const_imag gsl_vector_complex_get gsl_vector_complex_set
89 gsl_vector_complex_ptr gsl_vector_complex_const_ptr gsl_vector_complex_set_zero gsl_vector_complex_set_all
90 gsl_vector_complex_set_basis gsl_vector_complex_fread gsl_vector_complex_fwrite gsl_vector_complex_fscanf
91 gsl_vector_complex_fprintf gsl_vector_complex_memcpy gsl_vector_complex_reverse gsl_vector_complex_swap
92 gsl_vector_complex_swap_elements gsl_vector_complex_isnull gsl_vector_complex_ispos gsl_vector_complex_isneg
94 %EXPORT_TAGS
= ( all
=> [ @EXPORT_OK
] );
98 Math
::GSL
::Vector
- Functions concerning vectors
102 use Math
::GSL
::Vector qw
/:all
/;
103 my $vec1
= Math
::GSL
::Vector-
>new
([1, 7, 94, 15 ]);
104 my $vec2
= $vec1
* 5;
105 my $vec3
= Math
::GSL
::Vector
>new
(10); #
10 element zero vector
107 # set the element at index
1 to
9
108 # and the element at index
3 to
8
109 $vec3-
>set
([ 1, 3 ], [ 9, 8 ]);
111 my @vec
= $vec2-
>as_list
; # return elements as Perl list
113 my $dot_product
= $vec1
* $vec2
;
114 my $length
= $vec2-
>length
;
115 my $first
= $vec1-
>get
(0);
120 =head1 Objected Oriented Interface to GSL Math
::GSL
::Vector
122 =head2 Math
::GSL
::Vector-
>new
()
124 Creates a new Vector of the given size.
126 my $vector
= Math
::GSL
::Matrix-
>new
(3);
128 You can also create and set directly the values of the vector like this
:
130 my $vector
= Math
::GSL
::Vector-
>new
([2,4,1]);
134 my
($class
, $values
) = @_
;
135 my $length
= $#$values
;
138 if
( ref $values eq 'ARRAY'
){
139 die __PACKAGE__.'
::new
($x
) - $x must be a nonempty array reference' if $length
== -1;
140 $vector
= gsl_vector_alloc
($length
+1);
141 map
{ gsl_vector_set
($vector
, $_
, $values-
>[$_
] ) } (0 .. $length
);
142 $this-
>{_length
} = $length
+1;
143 } elsif
( (int
($values
) == $values
) && ($values > 0)) {
144 $vector
= gsl_vector_alloc
($values
);
145 gsl_vector_set_zero
($vector
);
146 $this-
>{_length
} = $values
;
148 die __PACKAGE__.'
::new
($x
) - $x must be an int or array reference'
;
150 $this-
>{_vector
} = $vector
;
155 Get the underlying GSL vector object created by SWIG
, useful for using gsl_vector_
* functions which do not have an OO counterpart.
157 my $vector
= Math
::GSL
::vector-
>new
(3);
158 my $gsl_vector
= $vector-
>raw
;
159 my $stuff
= gsl_vector_get
($gsl_vector
, 1);
163 sub raw
{ (shift
)->{_vector
} }
167 Returns the minimum value contained in the vector.
169 my $vector
= Math
::GSL
::Vector-
>new
([2,4,1]);
170 my $minimum
= $vector-
>min
;
176 return gsl_vector_min
($self-
>raw
);
181 Returns the minimum value contained in the vector.
183 my $vector
= Math
::GSL
::Vector-
>new
([2,4,1]);
184 my $maximum
= $vector-
>max
;
190 return gsl_vector_max
($self-
>raw
);
195 Returns the number of elements contained in the vector.
197 my $vector
= Math
::GSL
::Vector-
>new
([2,4,1]);
198 my $length
= $vector-
>length
;
202 sub length
{ my $self
=shift
; $self-
>{_length
} }
206 Gets the content of a Math
::GSL
::Vector object as a Perl list.
208 my $vector
= Math
::GSL
::vector-
>new
(3);
210 my @values
= $vector-
>as_list
;
215 $self-
>get
( [ 0 .. $self-
>length
- 1 ] );
220 Gets the value of an of a Math
::GSL
::Vector object.
222 my $vector
= Math
::GSL
::vector-
>new
(3);
224 my @values
= $vector-
>get
(2);
226 You can also enter an array of indices to receive their corresponding values
:
228 my $vector
= Math
::GSL
::vector-
>new
(3);
230 my @values
= $vector-
>get
([0,2]);
235 my
($self
, $indices
) = @_
;
236 return map
{ gsl_vector_get
($self-
>{_vector
}, $_
) } @$indices
;
241 Sets values of an of a Math
::GSL
::Vector object.
243 my $vector
= Math
::GSL
::vector-
>new
(3);
244 $vector-
>set
([1,2], [8,23]);
246 This sets the second and third value to
8 and
23.
251 my
($self
, $indices
, $values
) = @_
;
252 die
(__PACKAGE__.'
::set
($indices
, $values
) - $indices and $values must be array references of the same length'
)
253 unless
( ref $indices eq 'ARRAY'
&& ref $values eq 'ARRAY' && $#$indices == $#$values );
255 map
{ gsl_vector_set
($self-
>{_vector
}, $indices-
>[$_
], $values-
>[$_
] ) } (0..$#$indices
);
260 sub _multiplication
{
261 my
($left
,$right
) = @_
;
262 if
( blessed $right
&& $right->isa('Math::GSL::Vector') ) {
263 return $left-
>dot_product
($right
);
265 gsl_vector_scale
($left-
>raw
, $right
);
271 my
($left
,$right
) = @_
;
273 if
( blessed $right
&& $right->isa('Math::GSL::Vector') &&
274 blessed $left
&& $left->isa('Math::GSL::Vector') &&
275 $left-
>length
== $right-
>length
) {
276 my @l
= $left-
>as_list
;
277 my @r
= $right-
>as_list
;
278 map
{ $sum
+= $l
[$_
] * $r
[$_
] } (0..$#l
);
281 croak
"dot_product() must be called with two vectors";
287 Here is a list of all the functions included in this module
:
291 =item C
<gsl_vector_alloc
($x
)> - create a vector of size $x
293 =item C
<gsl_vector_calloc
($x
)> - create a vector of size $x and initializes all the elements of the vector to zero
295 =item C
<gsl_vector_alloc_from_block
>
297 =item C
<gsl_vector_alloc_from_vector
>
299 =item C
<gsl_vector_free
($v
)> - free a previously allocated vector $v
301 =item C
<gsl_vector_view_array
>
303 =item C
<gsl_vector_view_array_with_stride
>
305 =item C
<gsl_vector_const_view_array_with_stride
>
307 =item C
<gsl_vector_subvector
($v
, $offset
, $n
)> - return a vector_view type which contains a subvector of $v
, with a size of $size
, starting from the $offset position
309 =item C
<gsl_vector_subvector_with_stride
($v
, $offset
, $stride
, $size
)> - return a vector_view type which contains a subvector of $v
, with a size of $size
, starting from the $offset position and with a $stride step between each element of $v
311 =item C
<gsl_vector_const_subvector
>
313 =item C
<gsl_vector_get
($v
, $i
)> - return the $i-th element of a vector $v
315 =item C
<gsl_vector_set
($v
, $i
, $x
)> - return the vector $v with his $i-th element set to $x
317 =item C
<gsl_vector_ptr
>
319 =item C
<gsl_vector_const_ptr
>
321 =item C
<gsl_vector_set_zero
($v
)> - set all the elements of $v to
0
323 =item C
<gsl_vector_set_all
($v
, $x
)> - set all the elements of $v to $x
325 =item C
<gsl_vector_set_basis
($v
, $i
)> - set all the elements of $v to
0 except for the $i-th element which is set to
1 and return
0 if the operation succeded
, 1 otherwise.
327 =item C
<gsl_vector_fread
($file
, $v
)> - This function reads into the vector $v from the open stream $file opened with fopen in binary format. The vector $v must be preallocated with the correct length since the function uses the size of $v to determine how many bytes to read. The return value is
0 for success and
1 if there was a problem reading from the file.
329 =item C
<gsl_vector_fwrite
($file
, $v
)> - This function writes the elements of the vector $v to the stream $file opened with fopen in binary format. The return value is
0 for success and
1 if there was a problem writing to the file. Since the data is written in the native binary format it may not be portable between different architectures.
331 =item C
<gsl_vector_fscanf
($file
, $v
)> This function reads formatted data from the stream $file opened with fopen into the vector $v. The vector $v must be preallocated with the correct length since the function uses the size of $v to determine how many numbers to read. The function returns
0 for success and
1 if there was a problem reading from the file.
333 =item C
<gsl_vector_fprintf
($file
, $v
, $format
)> -This function writes the elements of the vector $v line-by-line to the stream $file opened with fopen using the format specifier format
, which should be one of the
"%g", "%e" or
"%f" formats for floating point numbers and
"%d" for integers. The function returns
0 for success and
1 if there was a problem writing to the file.
335 =item C
<gsl_vector_memcpy
($dest
, $src
)> - This function copies the elements of the vector $src into the vector $dest and return
0 if the opertaion succeded
, 1 otherwise. The two vectors must have the same length.
337 =item C
<gsl_vector_reverse
($v
)> - reverse the order of the elements of the vector $v and return
0 if the opertaion succeded
, 1 otherwise
339 =item C
<gsl_vector_swap
($v
, $v2
)> - swap the values of the vectors $v and $v2 and return
0 if the opertaion succeded
, 1 otherwise
341 =item C
<gsl_vector_swap_elements
($v
, $i
, $j
)> - permute the elements at position $i and $j in the vector $v and return
0 if the operation succeded
, 1 otherwise.
343 =item C
<gsl_vector_max
($v
)> - return the maximum value in the vector $v
345 =item C
<gsl_vector_min
($v
)> - return the minimum value in the vector $v
347 =item C
<gsl_vector_minmax
($v
)> - return two values
, the first is the minimum value in the vector $v and the second is the maximum value.
349 =item C
<gsl_vector_max_index
($v
)> - return the position of the maximum value in the vector $v
351 =item C
<gsl_vector_min_index
($v
)> - return the position of the minimum value in the vector $v
353 =item C
<gsl_vector_minmax_index
> - return two values
, the first is the position of the minimum value in the vector $v and the second is the position of the maximum value.
355 =item C
<gsl_vector_add
($v
, $v2
)> - add the elements of $v2 to the elements of $v
, the two vectors must have the same lenght and return
0 if the operation succeded
, 1 otherwise.
357 =item C
<gsl_vector_sub
($v
, $v2
)> - substract the elements of $v2 from the elements of $v
, the two vectors must have the same lenght and return
0 if the operation succeded
, 1 otherwise.
359 =item C
<gsl_vector_mul
($v
, $v2
)> - multiply the elements of $v by the elements of $v2
, the two vectors must have the same lenght and return
0 if the operation succeded
, 1 otherwise.
361 =item C
<gsl_vector_div
($v
, $v2
)> - divides the elements of $v by the elements of $v2
, the two vectors must have the same lenght and return
0 if the operation succeded
, 1 otherwise.
363 =item C
<gsl_vector_scale
($v
, $x
)> - multiplty the elements of the vector $v by a constant $x and return
0 if the operation succeded
, 1 otherwise.
365 =item C
<gsl_vector_add_constant
($v
, $x
)> - add a constant $x to the elements of the vector $v and return
0 if the operation succeded
, 1 otherwise.
367 =item C
<gsl_vector_isnull
($v
)> - verify if all the elements of the vector $v are null
, return
0 if it's the case
, 1 otherwise.
369 =item C
<gsl_vector_ispos
($v
)> - verify if all the elements of the vector $v are positive
, return
0 if it's the case
, 1 otherwise.
371 =item C
<gsl_vector_isneg
($v
)> - verify if all the elements of the vector $v are negative
, return
0 if it's the case
, 1 otherwise.
373 =item C
<gsl_vector_isnonneg
($v
)> - verify if all the elements the vector $v are not negative
, return
0 if it's the case
, 1 otherwise.
377 You have to add the functions you want to use inside the qw
/put_funtion_here
/ with spaces between each function. You can also write use Math
::GSL
::Complex qw
/:all
/ to use all avaible functions of the module.
380 Precision on the vector_view type
: every modification you'll make on a vector_view will also modify the original vector.
381 For example
, the following code will zero the even elements of the vector $v of length $size
, while leaving the odd elements untouched
:
385 =item C
<$v_even
= gsl_vector_subvector_with_stride
($v
, 0, 2, $size
/2);>
387 =item C
<gsl_vector_set_zero
($v_even-E
<gt
>{vector
});>
391 For more informations on the functions
, we refer you to the GSL offcial documentation
: L
<http
://www.gnu.org
/software
/gsl
/manual
/html_node
/>
392 Tip
: search on google
: site
:http
://www.gnu.org
/software
/gsl
/manual
/html_node
/ name_of_the_function_you_want
396 use Math
::GSL
::Vector qw
/:all
/;
397 print
"We'll create this vector : [0,1,4,9,16] \n";
398 my $vector
= Math
::GSL
::Vector-
>new
([0,1,4,9,16]);
399 my
($min
, $max
) = gsl_vector_minmax_index
($vector-
>raw
);
400 print
"We then check the index value of the maximum and minimum values of the vector. \n";
401 print
"The index of the maximum should be 4 and we received $max \n";
402 print
"The index of the minimum should be 0 and we received $min \n";
403 print
"We'll then swap the first and the third elements of the vector \n";
404 gsl_vector_swap_elements
($vector-
>raw
, 0, 3);
405 my @got
= $vector-
>as_list
;
406 print
"The vector should now be like this : [9,1,4,0,16] \n";
407 print
"and we received : [";
408 for
(my $element
=0; $element
<4; $element
++) {
409 print
"$got[$element],"; }
414 Jonathan Leto
<jonathan@leto.net
> and Thierry Moisan
<thierry.moisan@gmail.com
>
416 =head1 COPYRIGHT
AND LICENSE
418 Copyright
(C
) 2008 Jonathan Leto and Thierry Moisan
420 This program is free software
; you can redistribute it and
/or modify it
421 under the same terms as Perl itself.