denoising-historical-data/PEMOQ/toeplitzC.c
2021-08-30 18:42:12 +03:00

129 lines
3.3 KiB
C

/*=================================================================
*
* toeplitzC.C Sample .MEX file corresponding to toeplitz.m
* Solves simple 3 body orbit problem
*
* The calling syntax is:
*
* [yp] = yprime(t, y)
* TOEPLITZ(C,R) is a non-symmetric Toeplitz matrix having C as its
* first column and R as its first row.
*
* TOEPLITZ(R) is a symmetric Toeplitz matrix for real R.
* For a complex vector R with a real first element, T = toeplitz(r)
* returns the Hermitian Toeplitz matrix formed from R. When the
* first element of R is not real, the resulting matrix is Hermitian
* off the main diagonal, i.e., T_{i,j} = conj(T_{j,i}) for i ~= j.
*
* You may also want to look at the corresponding M-code, yprime.m.
*
* This is a MEX-file for MATLAB.
* Copyright 1984-2006 The MathWorks, Inc.
*
*=================================================================*/
/* $Revision: 1.10.6.4 $ */
#include <math.h>
#include "mex.h"
/* Input Arguments */
#define C_IN prhs[0]
#define R_IN prhs[1]
/* Output Arguments */
#define T_OUT plhs[0]
static void toeplitzC(
double t[],
double c[],
double r[],
int m, int n
)
{
int i,j,m0;
for (j=0;j<n;j++){
m0 = j>m?m:j;
for (i=0;i<=m0;i++)
t[j*m+i] = r[j-i];
for (i=j+1;i<m;i++)
t[j*m+i] = c[i-j];
}
return;
}
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray*prhs[] )
{
double *tr,*ti;
double *cr,*ci,*rr,*ri;
mwSize tm,tn;
/* Check for proper number of arguments */
if (nrhs > 2) {
mexErrMsgTxt("More than 2 input arguments.");
} else if (nrhs == 0) {
mexErrMsgTxt("1 or 2 input arguments required.");
} else if (nrhs == 1) {
mexErrMsgTxt("1 input argument: not implemented (yet), use toeplitz.");
} else if (nlhs > 1) {
mexErrMsgTxt("Too many output arguments.");
}
if (nrhs == 1) {
mexErrMsgTxt("Not implemented (yet). Please use 2 input arguments or toeplitz.m with one input argument.");
}
/* Check the dimensions of Y. Y can be 4 X 1 or 1 X 4. */
tm = mxGetNumberOfElements(C_IN);
tn = mxGetNumberOfElements(R_IN);
/* Create a matrix for the return argument */
if (mxIsComplex(C_IN) || mxIsComplex(R_IN))
T_OUT = mxCreateDoubleMatrix(tm, tn, mxCOMPLEX);
else
T_OUT = mxCreateDoubleMatrix(tm, tn, mxREAL);
/* Assign pointers to the various parameters */
tr = mxGetPr(T_OUT);
cr = mxGetPr(C_IN);
rr = mxGetPr(R_IN);
/* Do the actual computations in a subroutine */
toeplitzC(tr,cr,rr,tm,tn);
/* Imaginary part */
if (mxIsComplex(C_IN) || mxIsComplex(R_IN)){
/*if (!mxIsComplex(C_IN)){
mexErrMsgTxt("Not implemented (yet). A");
}
else*/
if (mxIsComplex(C_IN))
ci = mxGetPi(C_IN);
else
ci = mxGetPr(mxCreateDoubleMatrix(tm, 1, mxREAL));
/*if (!mxIsComplex(R_IN)){
mexErrMsgTxt("Not implemented (yet). B");
}
else*/
if (mxIsComplex(R_IN))
ri = mxGetPi(R_IN);
else
ri = mxGetPr(mxCreateDoubleMatrix(tn, 1, mxREAL));
ti = mxGetPi(T_OUT);
toeplitzC(ti, ci, ri, tm, tn);
}
return;
}