DSP-LinPred_XS
view release on metacpan or search on metacpan
lib/DSP/LinPred_XS.xs view on Meta::CPAN
#ifdef __cplusplus
extern "C" {
#endif
#define PERL_NO_GET_CONTEXT /* we want efficiency */
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>
#ifdef __cplusplus
} /* extern "C" */
#endif
#define NEED_newSVpvn_flags
#include "ppport.h"
MODULE = DSP::LinPred_XS PACKAGE = DSP::LinPred_XS
PROTOTYPES: DISABLE
void
get_stat(...)
PPCODE:
{
if(items != 1){
croak("Invalid argument");
}
SV* input = ST(0);
AV* av = (AV*)SvRV(input);
IV length = av_len(av) + 1;
IV k;
NV sum = 0;
NV variance = 0;
NV mean,stddev,temp;
SV** avv_ptr;
SV* av_val;
for(k=0;k <= length -1;k++){
avv_ptr = av_fetch(av,k,FALSE);
av_val = avv_ptr ? *avv_ptr : &PL_sv_undef;
sum = sum + SvNV(av_val);
}
mean = sum / length;
for(k=0;k <= length -1;k++){
avv_ptr = av_fetch(av,k,FALSE);
av_val = avv_ptr ? *avv_ptr : &PL_sv_undef;
temp = SvNV(av_val);
variance = variance + (temp - mean)*(temp - mean);
}
variance = variance / length;
stddev = sqrt(variance);
mXPUSHs(newSVnv(sum));
mXPUSHs(newSVnv(mean));
mXPUSHs(newSVnv(variance));
mXPUSHs(newSVnv(stddev));
XSRETURN(4);
}
( run in 2.533 seconds using v1.01-cache-2.11-cpan-71847e10f99 )