00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <math.h>
00020 #include "mex.h"
00021
00022 #define XR(i,j) xr[i+4*j]
00023 #define XI(i,j) xi[i+4*j]
00024
00025 static void fill_array( double *xr, double *xi)
00026 {
00027 double tmp;
00028 int i,j,jj;
00029
00030
00031
00032
00033 for (j = 0; j < 4; j++) {
00034 for (i = 0; i <= j; i++) {
00035 XR(i,j) = 4 + i - j;
00036 XR(j,i) = XR(i,j);
00037 XI(i,j) = j - i + 1;
00038 XI(j,i) = XI(i,j);
00039 }
00040 }
00041
00042 for (j = 0; j < 2; j++) {
00043 for (i = 0; i < 4; i++) {
00044 tmp = XR(i,j);
00045 jj = 3 - j;
00046 XR(i,j) = XR(i,jj);
00047 XR(i,jj) = tmp;
00048 }
00049 }
00050 }
00051
00052
00053 static void invertd( double *xr, double *xi )
00054 {
00055 double tmp;
00056 double *rx, *ix;
00057 int i;
00058
00059 rx = xr;
00060 ix = xi;
00061
00062
00063 for (i = 0; i < 16; i += 5, rx += 5, ix += 5) {
00064 tmp = *rx * *rx + *ix * *ix;
00065 *rx = *rx / tmp;
00066 *ix = - *ix / tmp;
00067 }
00068 }
00069
00070 void
00071 mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
00072 {
00073 mwSize m, n;
00074 mxArray *lhs[2], *x;
00075 (void) prhs;
00076
00077 m = n = 4;
00078
00079
00080 if (nrhs != 0) {
00081 mexErrMsgTxt("No input arguments required.");
00082 }
00083 if(nlhs > 1){
00084 mexErrMsgTxt("Too many output arguments.");
00085 }
00086
00087
00088 x = mxCreateDoubleMatrix(m, n, mxCOMPLEX);
00089
00090
00091
00092 fill_array(mxGetPr(x), mxGetPi(x));
00093
00094
00095 mexCallMATLAB(0,NULL,1, &x, "disp");
00096
00097
00098 mexCallMATLAB(2, lhs, 1, &x, "eig");
00099
00100
00101 mexCallMATLAB(0,NULL,1, &lhs[1], "disp");
00102
00103
00104 invertd(mxGetPr(lhs[1]), mxGetPi(lhs[1]));
00105
00106
00107 mexCallMATLAB(0,NULL,1, &lhs[1], "disp");
00108
00109
00110 mxDestroyArray(x);
00111 mxDestroyArray(lhs[1]);
00112 plhs[0] = lhs[0];
00113 }
00114