1 %module
"Math::GSL::Sort"
2 /* Danger Will Robinson
! */
5 %include
"gsl_typemaps.i"
7 %typemap
(argout
) (double
* data
, const size_t stride
, const size_t n
) {
12 av_push
(tempav
, newSVnv
((double
) $
1[i
]));
16 $result
= sv_2mortal
( newRV_noinc
( (SV
*) tempav
) );
17 //Perl_sv_dump
($result
);
20 %typemap
(argout
) (double
* dest
, const size_t k
, const gsl_vector
* v
) {
25 av_push
(tempav
, newSVnv
((double
) $
1[i
]));
29 $result
= sv_2mortal
( newRV_noinc
( (SV
*) tempav
) );
33 %typemap
(argout
) (double
* dest
, const size_t k
, const double
* src
, const size_t stride
, const size_t n
) {
37 av_push
(tempav
, newSVnv
((double
) $
1[i
]));
41 $result
= sv_2mortal
( newRV_noinc
( (SV
*) tempav
) );
44 %typemap
(argout
) (size_t
* p
, const size_t k
, const gsl_vector
* v
)
49 av_push
(tempav
, newSVnv
((double
) $
1[i
]));
53 $result
= sv_2mortal
( newRV_noinc
( (SV
*) tempav
) );
57 %typemap
(argout
) (size_t
* p
, const double
* data
, const size_t stride
, const size_t n
)
62 av_push
(tempav
, newSVnv
((size_t
) $
1[i
]));
66 $result
= sv_2mortal
( newRV_noinc
( (SV
*) tempav
) );
70 %typemap
(argout
) (size_t
* p
, const size_t k
, const double
* src
, const size_t stride
, const size_t n
)
75 av_push
(tempav
, newSVnv
((size_t
) $
1[i
]));
79 $result
= sv_2mortal
( newRV_noinc
( (SV
*) tempav
) );
83 %apply double
* { double
*data
, double
*dest
};
86 #include
"gsl/gsl_nan.h"
87 #include
"gsl/gsl_sort.h"
88 #include
"gsl/gsl_sort_double.h"
89 #include
"gsl/gsl_sort_int.h"
90 #include
"gsl/gsl_sort_vector.h"
91 #include
"gsl/gsl_sort_vector_double.h"
92 #include
"gsl/gsl_sort_vector_int.h"
93 #include
"gsl/gsl_permutation.h"
95 %include
"gsl/gsl_nan.h"
96 %include
"gsl/gsl_sort.h"
97 %include
"gsl/gsl_sort_double.h"
98 %include
"gsl/gsl_sort_int.h"
99 %include
"gsl/gsl_sort_vector.h"
100 %include
"gsl/gsl_sort_vector_double.h"
101 %include
"gsl/gsl_sort_vector_int.h"
102 %include
"gsl/gsl_permutation.h"
107 gsl_sort gsl_sort_index
108 gsl_sort_smallest gsl_sort_smallest_index
109 gsl_sort_largest gsl_sort_largest_index
112 gsl_sort_vector gsl_sort_vector_index
113 gsl_sort_vector_smallest gsl_sort_vector_smallest_index
114 gsl_sort_vector_largest gsl_sort_vector_largest_index
116 @EXPORT_OK
= ( @EXPORT_plain
, @EXPORT_vector
);
118 all
=> [ @EXPORT_OK
],
119 plain
=> [ @EXPORT_plain
],
120 vector
=> [ @EXPORT_vector
],
126 Math
::GSL
::Sort
- Functions for sorting data
130 use Math
::GSL
::Sort qw
/:all
/;
131 my $x
= [ 2**15, 1.67, 20e5
, -17, 6900, 1/3 , 42e-10 ];
132 my $sorted
= gsl_sort
($x
, 1, $#$x
+1 );
133 my $numbers
= [ map
{ rand
(100) } (1.
.100) ];
134 my
($status
, $smallest10
) = gsl_sort_smallest
($array
, 10, $x
, 1, $#$x
+1);
139 Here is a list of all the functions included in this module
:
143 =item
* gsl_sort_vector
($v
)
145 This function sorts the elements of the vector $v into ascending numerical order.
147 =item
* gsl_sort_vector_index
($p
, $v
)
149 This function indirectly sorts the elements of the vector $v into ascending
150 order
, storing the resulting permutation in $p. The elements of $p give the
151 index of the vector element which would have been stored in that position if
152 the vector had been sorted in place. The first element of $p gives the index
153 of the least element in $v
, and the last element of $p gives the index of the
154 greatest element in $v. The vector $v is not changed.
156 =item
* gsl_sort_vector_smallest
($array
, $k
, $vector
)
158 This function outputs
0 if the operation succeeded
, 1 otherwise and then the
159 $k smallest elements of the vector $v. $k must be less than or equal to the
160 length of the vector $v.
162 =item
* gsl_sort_vector_smallest_index
($p
, $k
, $v
)
164 This function outputs
0 if the operation succeeded
, 1 otherwise and then the
165 indices of the $k smallest elements of the vector $v. $p must be a prealocated
166 array reference. This should be removed in further versions. $k must be less
167 than or equal to the length of the vector $v.
169 =item
* gsl_sort_vector_largest
($array
, $k
, $vector
)
171 This function outputs
0 if the operation succeeded
, 1 otherwise and then the
172 $k largest elements of the vector $v. $k must be less than or equal to the
173 length of the vector $v.
175 =item
* gsl_sort_vector_largest_index
($p
, $k
, $v
)
177 This function outputs
0 if the operation succeeded
, 1 otherwise and then the
178 indices of the $k largest elements of the vector $v. $p must be a prealocated
179 array reference. This should be removed in further versions. $k must be less
180 than or equal to the length of the vector $v.
182 =item
* gsl_sort
($data
, $stride
, $n
)
184 This function returns an array reference to the sorted $n elements of the
185 array $data with stride $stride into ascending numerical order.
187 =item
* gsl_sort_index
($p
, $data
, $stride
, $n
)
189 This function indirectly sorts the $n elements of the array $data with stride
190 $stride into ascending order
, outputting the permutation in the foram of an
191 array. $p must be a prealocated array reference. This should be removed in
192 further versions. The array $data is not changed.
194 =item
* gsl_sort_smallest
($array
, $k
, $data
, $stride
, $n
)
196 This function outputs
0 if the operation succeeded
, 1 otherwise and then the
197 $k smallest elements of the array $data
, of size $n and stride $stride
, in
198 ascending numerical. The size $k of the subset must be less than or equal to
199 $n. The data $src is not modified by this operation. $array must be a
200 prealocated array reference. This should be removed in further versions.
202 =item
* gsl_sort_smallest_index
($p
, $k
, $src
, $stride
, $n
)
204 This function outputs
0 if the operation succeeded
, 1 otherwise and then the
205 indices of the $k smallest elements of the array $src
, of size $n and stride
206 $stride. The indices are chosen so that the corresponding data is in ascending
207 numerical order. $k must be less than or equal to $n. The data $src is not
208 modified by this operation. $p must be a prealocated array reference. This
209 should be removed in further versions.
211 =item
* gsl_sort_largest
($array
, $k
, $data
, $stride
, $n
)
213 This function outputs
0 if the operation succeeded
, 1 otherwise and then the
214 $k largest elements of the array $data
, of size $n and stride $stride
, in
215 ascending numerical. The size $k of the subset must be less than or equal to
216 $n. The data $src is not modified by this operation. $array must be a
217 prealocated array reference. This should be removed in further versions.
219 =item
* gsl_sort_largest_index
($p
, $k
, $src
, $stride
, $n
)
221 This function outputs
0 if the operation succeeded
, 1 otherwise and then the
222 indices of the $k largest elements of the array $src
, of size $n and stride
223 $stride. The indices are chosen so that the corresponding data is in ascending
224 numerical order. $k must be less than or equal to $n. The data $src is not
225 modified by this operation. $p must be a prealocated array reference. This
226 should be removed in further versions.
230 Here is a complete list of all tags for this module
:
242 For more informations on the functions
, we refer you to the GSL offcial documentation
:
243 L
<http
://www.gnu.org
/software
/gsl
/manual
/html_node
/>
245 Tip
: search on google
: L
<http
://www.gnu.org
/software
/gsl
/manual
/html_node
/name_of_the_function_you_want
>
249 In the source code of Math
::GSL
, the file
"examples/benchmark/sort" compares
250 the performance of gsl_sort
() to Perl's builtin sort
() function. It's first
251 argument is the number of iterations and the second is the size of the array
252 of numbers to sort. For example
, to see a benchmark of
1000 iterations for
253 arrays of size
50000 you would type
255 .
/examples
/benchmark
/sort
1000 50000
257 Initial benchmarks indicate just slightly above a
2x performance increase
258 over sort
() for arrays of between
5000 and
50000 elements. This may mostly
259 be due to the fact that gsl_sort
() takes and returns a reference while sort
()
260 takes and returns a plain list.
264 Jonathan Leto
<jonathan@leto.net
> and Thierry Moisan
<thierry.moisan@gmail.com
>
266 =head1 COPYRIGHT
AND LICENSE
268 Copyright
(C
) 2008 Jonathan Leto and Thierry Moisan
270 This program is free software
; you can redistribute it and
/or modify it
271 under the same terms as Perl itself.