Update META.yml
[Math-GSL.git] / Vector.i
blob217cddbe043667a4fbbd6f14140dd6f59346d28b
1 %module "Math::GSL::Vector"
3 %include "typemaps.i"
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 {
10 AV *tempav;
11 I32 len;
12 int i;
13 SV **tv;
14 if (!SvROK($input))
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);
20 len = av_len(tempav);
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 *);
29 int fclose(FILE *);
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"
52 %perlcode %{
53 use Scalar::Util 'blessed';
54 use Carp qw/croak/;
55 use overload
56 '*' => \&_multiplication,
57 fallback => 1,
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 ] );
96 =head1 NAME
98 Math::GSL::Vector - Functions concerning vectors
100 =head1 SYNOPSIS
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);
118 =cut
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]);
132 =cut
133 sub new {
134 my ($class, $values) = @_;
135 my $length = $#$values;
136 my $this = {};
137 my $vector;
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;
147 } else {
148 die __PACKAGE__.'::new($x) - $x must be an int or array reference';
150 $this->{_vector} = $vector;
151 bless $this, $class;
153 =head2 raw()
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);
161 =cut
163 sub raw { (shift)->{_vector} }
165 =head2 min()
167 Returns the minimum value contained in the vector.
169 my $vector = Math::GSL::Vector->new([2,4,1]);
170 my $minimum = $vector->min;
172 =cut
174 sub min {
175 my $self=shift;
176 return gsl_vector_min($self->raw);
179 =head2 max()
181 Returns the minimum value contained in the vector.
183 my $vector = Math::GSL::Vector->new([2,4,1]);
184 my $maximum = $vector->max;
186 =cut
188 sub max {
189 my $self=shift;
190 return gsl_vector_max($self->raw);
193 =head2 length()
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;
200 =cut
202 sub length { my $self=shift; $self->{_length} }
204 =head2 as_list()
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;
211 =cut
213 sub as_list {
214 my $self=shift;
215 $self->get( [ 0 .. $self->length - 1 ] );
218 =head2 get()
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]);
232 =cut
234 sub get {
235 my ($self, $indices) = @_;
236 return map { gsl_vector_get($self->{_vector}, $_ ) } @$indices ;
239 =head2 set()
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.
248 =cut
250 sub set {
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 );
254 eval {
255 map { gsl_vector_set($self->{_vector}, $indices->[$_], $values->[$_] ) } (0..$#$indices);
257 return;
260 sub _multiplication {
261 my ($left,$right) = @_;
262 if ( blessed $right && $right->isa('Math::GSL::Vector') ) {
263 return $left->dot_product($right);
264 } else {
265 gsl_vector_scale($left->raw, $right);
267 return $left;
270 sub dot_product {
271 my ($left,$right) = @_;
272 my $sum=0;
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);
279 return $sum;
280 } else {
281 croak "dot_product() must be called with two vectors";
285 =head1 DESCRIPTION
287 Here is a list of all the functions included in this module :
289 =over 1
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.
375 =back
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 :
383 =over 1
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});>
389 =back
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
394 =head1 EXAMPLES
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],"; }
410 print "$got[4]] \n";
412 =head1 AUTHOR
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.
423 =cut