myofibrometry / matlab / orientation / EigenVectors3D.c
EigenVectors3D.c
Raw
#include "mex.h"
#include "math.h"
#include "EigenDecomposition3.c"

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) {
    float *Dxx, *Dxy, *Dxz, *Dyy, *Dyz, *Dzz;
    float *Deiga, *Deigb, *Deigc;
	float *Dvecxa, *Dvecya, *Dvecza;
	float *Dvecxb, *Dvecyb, *Dveczb;
	float *Dvecxc, *Dvecyc, *Dveczc;

    mwSize output_dims[2]={1, 3};
    double Ma[3][3];
    double Davec[3][3];
    double Daeig[3];
    
    /* Loop variable */
    int i;
    
    /* Size of input */
    const mwSize *idims;
    int nsubs=0;
    
    /* Number of pixels */
    int npixels=1;
    
    /* Check for proper number of arguments. */
    if(nrhs!=6) {
        mexErrMsgTxt("Six inputs are required.");
    } else if(nlhs!=12) {
        mexErrMsgTxt("Twelve outputs are required");
    }
    
    for(i=0; i<6; i++) {
        if(!mxIsSingle(prhs[i])){ mexErrMsgTxt("Inputs must be single"); }
    }
    
    /*  Get the number of dimensions */
    nsubs = mxGetNumberOfDimensions(prhs[0]);
    /* Get the sizes of the inputs */
    idims = mxGetDimensions(prhs[0]);
    for (i=0; i<nsubs; i++) { npixels=npixels*idims[i]; }
    
    /* Assign pointers to each input. */
    Dxx = (float *)mxGetPr(prhs[0]);
    Dxy = (float *)mxGetPr(prhs[1]);
    Dxz = (float *)mxGetPr(prhs[2]);
    Dyy = (float *)mxGetPr(prhs[3]);
    Dyz = (float *)mxGetPr(prhs[4]);
    Dzz = (float *)mxGetPr(prhs[5]);

	/* Assign pointers to each output. */
    plhs[0] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
    plhs[1] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
    plhs[2] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
    Deiga = (float *)mxGetPr(plhs[0]); Deigb = (float *)mxGetPr(plhs[1]); Deigc = (float *)mxGetPr(plhs[2]);
    
	/* eigenvectors) */
    plhs[3] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
    plhs[4] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
    plhs[5] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
	Dvecxa = (float *)mxGetPr(plhs[3]); Dvecya = (float *)mxGetPr(plhs[4]); Dvecza = (float *)mxGetPr(plhs[5]);
    
    plhs[6] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
    plhs[7] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
    plhs[8] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
	Dvecxb = (float *)mxGetPr(plhs[6]); Dvecyb = (float *)mxGetPr(plhs[7]); Dveczb = (float *)mxGetPr(plhs[8]);
    
    plhs[9] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
    plhs[10] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
    plhs[11] = mxCreateNumericArray(nsubs, idims, mxSINGLE_CLASS, mxREAL);
	Dvecxc = (float *)mxGetPr(plhs[9]); Dvecyc = (float *)mxGetPr(plhs[10]); Dveczc = (float *)mxGetPr(plhs[11]);
        
	for(i=0; i<npixels; i++) {
		Ma[0][0]=(double)Dxx[i]; Ma[0][1]=(double)Dxy[i]; Ma[0][2]=(double)Dxz[i];
		Ma[1][0]=(double)Dxy[i]; Ma[1][1]=(double)Dyy[i]; Ma[1][2]=(double)Dyz[i];
		Ma[2][0]=(double)Dxz[i]; Ma[2][1]=(double)Dyz[i]; Ma[2][2]=(double)Dzz[i];
		eigen_decomposition(Ma, Davec, Daeig);
        
		Deiga[i]=(float)Daeig[2]; 
        Deigb[i]=(float)Daeig[1]; 
        Deigc[i]=(float)Daeig[0];
        
		Dvecxa[i]=(float)Davec[0][2]; Dvecya[i]=(float)Davec[1][2]; Dvecza[i]=(float)Davec[2][2];
		Dvecxb[i]=(float)Davec[0][1]; Dvecyb[i]=(float)Davec[1][1]; Dveczb[i]=(float)Davec[2][1];
		Dvecxc[i]=(float)Davec[0][0]; Dvecyc[i]=(float)Davec[1][0]; Dveczc[i]=(float)Davec[2][0];
	}
}