266 rivejä
5.4 KiB
C
266 rivejä
5.4 KiB
C
#include "cmPrefix.h"
|
|
#include "cmGlobal.h"
|
|
#include "cmFloatTypes.h"
|
|
#include "cmComplexTypes.h"
|
|
#include "cmRpt.h"
|
|
#include "cmErr.h"
|
|
#include "cmCtx.h"
|
|
#include "cmMem.h"
|
|
#include "cmMallocDebug.h"
|
|
#include "cmLinkedHeap.h"
|
|
#include "cmSymTbl.h"
|
|
#include "cmMath.h"
|
|
|
|
#ifdef OS_LINUX
|
|
#include <cblas.h>
|
|
#endif
|
|
|
|
#include "cmAudioFile.h"
|
|
#include "cmFileSys.h"
|
|
#include "cmProcObj.h"
|
|
#include "cmProcTemplate.h"
|
|
#include "cmProc.h"
|
|
#include "cmVectOps.h"
|
|
|
|
#define cmVectOpsTemplateCode_h
|
|
#define cmVectOpsRICode_h
|
|
#include "cmVectOpsTemplateMain.h"
|
|
|
|
|
|
void cmVOU_VPrint( cmRpt_t* rpt, const char* fmt, ... )
|
|
{
|
|
va_list vl;
|
|
va_start(vl,fmt);
|
|
if( rpt == NULL )
|
|
vprintf(fmt,vl);
|
|
else
|
|
cmRptVPrintf(rpt,fmt,vl);
|
|
va_end(vl);
|
|
}
|
|
|
|
void cmVOI_Print( cmRpt_t* rpt, unsigned rn, unsigned cn, const int* sbp )
|
|
{
|
|
unsigned fieldWidth = cmDefaultFieldWidth;
|
|
|
|
if( fieldWidth < 0 )
|
|
fieldWidth = 10;
|
|
|
|
unsigned ri,ci;
|
|
for(ri=0; ri<rn; ++ri)
|
|
{
|
|
for(ci=0; ci<cn; ++ci )
|
|
cmVOU_VPrint(rpt,"%*i ",fieldWidth,sbp[ (ci*rn) + ri ]);
|
|
|
|
if( cn > 0 )
|
|
cmVOU_VPrint(rpt,"\n");
|
|
}
|
|
}
|
|
|
|
void cmVOU_Print( cmRpt_t* rpt, unsigned rn, unsigned cn, const unsigned* sbp )
|
|
{
|
|
unsigned fieldWidth = cmDefaultFieldWidth;
|
|
|
|
if( fieldWidth < 0 )
|
|
fieldWidth = 10;
|
|
|
|
unsigned ri,ci;
|
|
for(ri=0; ri<rn; ++ri)
|
|
{
|
|
for(ci=0; ci<cn; ++ci )
|
|
cmVOU_VPrint(rpt,"%*u ",fieldWidth,sbp[ (ci*rn) + ri ]);
|
|
|
|
if( cn > 0 )
|
|
cmVOU_VPrint(rpt,"\n");
|
|
}
|
|
}
|
|
|
|
void cmVOI_PrintL( const char* label, cmRpt_t* rpt, unsigned rn, unsigned cn, const int* sp )
|
|
{
|
|
cmVOU_VPrint(rpt,"%s ",label);
|
|
return cmVOI_Print(rpt,rn,cn,sp);
|
|
}
|
|
|
|
void cmVOU_PrintL( const char* label, cmRpt_t* rpt, unsigned rn, unsigned cn, const unsigned* sp )
|
|
{
|
|
cmVOU_VPrint(rpt,"%s ",label);
|
|
return cmVOU_Print(rpt,rn,cn,sp);
|
|
}
|
|
|
|
unsigned* cmVOU_Mod( unsigned* dbp, unsigned dn, unsigned modVal )
|
|
{
|
|
const unsigned* dep = dbp + dn;
|
|
unsigned* dp = dbp;
|
|
|
|
while( dbp < dep )
|
|
*dbp++ %= modVal;
|
|
|
|
return dp;
|
|
}
|
|
|
|
unsigned* cmVOU_Hist( unsigned* hbp, unsigned hn, const unsigned* sbp, unsigned sn )
|
|
{
|
|
const unsigned* sep = sbp + sn;
|
|
|
|
unsigned* rp = hbp;
|
|
|
|
memset(hbp,0,hn * sizeof(*hbp));
|
|
|
|
while( sbp < sep )
|
|
{
|
|
assert( *sbp < hn );
|
|
|
|
++hbp[ *sbp++ ];
|
|
}
|
|
return rp;
|
|
}
|
|
|
|
unsigned* cmVOU_Random( unsigned* vbp, unsigned vn, unsigned maxValue )
|
|
{
|
|
unsigned* rp = vbp;
|
|
const unsigned* vep = vbp + vn;
|
|
while( vbp < vep )
|
|
*vbp++ = rand() % (maxValue+1);
|
|
|
|
return rp;
|
|
}
|
|
|
|
unsigned* cmVOU_UniqueRandom( unsigned* dV, unsigned dN, unsigned maxValue )
|
|
{
|
|
assert( dN < maxValue );
|
|
|
|
if( dN == 0 )
|
|
return dV;
|
|
|
|
|
|
// if maxValue is less than twice dN then use cmVOU_RandomSeq() to
|
|
// generate the random numbers. This is intended to avoid a situation
|
|
// where the attempt to generate a unique random number is confined
|
|
// to an decreasing range of possible target values - as would occur
|
|
// if dN==maxValue.
|
|
if( maxValue / dN <= 2 )
|
|
{
|
|
unsigned* v = cmMemAllocZ( unsigned, maxValue+1 );
|
|
cmVOU_RandomSeq(v,maxValue+1);
|
|
cmVOU_Copy(dV,dN,v);
|
|
cmMemPtrFree(&v);
|
|
}
|
|
|
|
unsigned* tV = cmMemAllocZ( unsigned, dN );
|
|
unsigned i = 0;
|
|
unsigned j = 0;
|
|
unsigned n = dN;
|
|
|
|
while(n)
|
|
{
|
|
// generate a set of random integers
|
|
cmVOU_Random(tV,n,maxValue);
|
|
|
|
// store each unique random int
|
|
for(j=0; j<n; ++j)
|
|
if( cmVOU_Count(dV,i,tV[j]) == 0 )
|
|
dV[i++] = tV[j];
|
|
|
|
n = dN - i;
|
|
|
|
}
|
|
|
|
cmMemPtrFree(&tV);
|
|
return dV;
|
|
}
|
|
|
|
int cmVOU_Compare(const void* p0, const void* p1)
|
|
{ return *(unsigned*)p0 < *(unsigned*)p1; }
|
|
|
|
unsigned* cmVOU_RandomSeq( unsigned* vbp, unsigned vn )
|
|
{
|
|
unsigned i,j;
|
|
unsigned* r = cmMemAllocZ( unsigned, vn );
|
|
|
|
// generate a list of random values
|
|
for(i=0; i<vn; ++i)
|
|
{
|
|
r[i] = rand();
|
|
vbp[i] = r[i];
|
|
}
|
|
|
|
// sort the random number list
|
|
qsort(r,vn,sizeof(unsigned),cmVOU_Compare);
|
|
|
|
// set vbp[i] to the index of the matching value in r[]
|
|
for(i=0; i<vn; ++i)
|
|
for(j=0; j<vn; ++j)
|
|
if( vbp[i] == r[j] )
|
|
{
|
|
vbp[i] = j;
|
|
break;
|
|
}
|
|
|
|
|
|
cmMemPtrFree(&r);
|
|
|
|
return vbp;
|
|
}
|
|
|
|
|
|
cmReal_t cmVOU_Mean(const unsigned* sp, unsigned sn )
|
|
{
|
|
cmReal_t sum = (cmReal_t)cmVOU_Sum(sp,sn);
|
|
return sum/sn;
|
|
}
|
|
|
|
cmReal_t cmVOU_Variance(const unsigned* sp, unsigned sn, const cmReal_t* meanPtr)
|
|
{
|
|
if( sn <= 1 )
|
|
return 0;
|
|
|
|
cmReal_t sum = 0;
|
|
cmReal_t mv = meanPtr==NULL ? cmVOU_Mean(sp,sn) : *meanPtr;
|
|
const unsigned* bp = sp;
|
|
const unsigned* ep = sp + sn;
|
|
|
|
for(; bp < ep; ++bp )
|
|
sum += (((cmReal_t)*bp)-mv) * (((cmReal_t)*bp)-mv);
|
|
|
|
return sum / (sn-1);
|
|
}
|
|
|
|
cmReal_t cmVOI_Mean(const int* sp, unsigned sn )
|
|
{
|
|
cmReal_t sum = (cmReal_t)cmVOI_Sum(sp,sn);
|
|
return sum/sn;
|
|
}
|
|
|
|
cmReal_t cmVOI_Variance(const int* sp, unsigned sn, const cmReal_t* meanPtr)
|
|
{
|
|
if( sn <= 1 )
|
|
return 0;
|
|
|
|
cmReal_t sum = 0;
|
|
cmReal_t mv = meanPtr==NULL ? cmVOI_Mean(sp,sn) : *meanPtr;
|
|
const int* bp = sp;
|
|
const int* ep = sp + sn;
|
|
|
|
for(; bp < ep; ++bp )
|
|
sum += (((cmReal_t)*bp)-mv) * (((cmReal_t)*bp)-mv);
|
|
|
|
return sum / (sn-1);
|
|
}
|
|
|
|
|
|
|
|
// dbp[1,dn] = v[1,vn] * m[vn,dn]
|
|
cmComplexR_t* cmVORC_MultVVM( cmComplexR_t* dbp, unsigned dn, const cmComplexR_t* vp, unsigned vn, const cmComplexR_t* mp )
|
|
{
|
|
cmComplexR_t alpha = 1.0 + (I*0);
|
|
cmComplexR_t beta = 0.0 + (I*0);
|
|
|
|
unsigned drn = 1;
|
|
unsigned dcn = dn;
|
|
unsigned n = vn;
|
|
|
|
|
|
cblas_zgemm( CblasColMajor, CblasNoTrans, CblasNoTrans, drn, dcn, n, &alpha, vp, drn, mp, n, &beta, dbp, drn );
|
|
|
|
return dbp;
|
|
}
|