#include "mex.h"

void mxm(double *xr, double *xi, double *yr, double *yi, double *zr, double *zi, int mx, int nx, int my, int ny) {
	int i,j,k;
	int vz,vx,vy;
	zr[0]=0.0;
	zi[0]=0.0;
	if (nx==my) {
		for (i=0;i<mx;i++) {
			vz=j*mx+i;
			for (j=0;j<ny;j++) {
				*(zr+vz) = *(zr+vz) + *(xr+k*mx+i) * *(yr+j*my+k);
				*(zi+vz) = *(zi+vz) + *(xr+k*mx+i) * *(yi+j*my+k);
			}
		}
	}
}

/*La gateway routine*/
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
	double *y, *z, *x;
	double *xr, *xi, *yr, *yi, *zr, *zi;
	int status, mx, nx;
	int my, ny;
	/*Controlla il corretto numero di argomenti*/
	if (nrhs!=2) mexErrMsgTxt("Due input richiesti");
	if (nlhs!=1) mexErrMsgTxt("Un output richiesto");
	/*Controlla che entrambi gli input siano complessi*/
	if(!mxIsComplex(prhs[0]) || !mxIsComplex(prhs[1])) mexErrMsgTxt("Gli input devono essere complessi");
	/*Matrice di input x*/
	x = mxGetPr(prhs[0]);
	/*Dimensioni della matrice di input x*/
	mx = mxGetM(prhs[0]);
	nx = mxGetN(prhs[0]);
	/*Matrice di input y*/
	y = mxGetPr(prhs[1]);
	my = mxGetM(prhs[1]);
	ny = mxGetN(prhs[1]);
	/*Ottiene puntatori alle parti reali e immaginari degli input*/
	xr = mxGetPr(prhs[0]); 
	xi = mxGetPi(prhs[0]);
	yr = mxGetPr(prhs[1]);
	yi = mxGetPi(prhs[1]);
	/*puntatore della matrice di output z*/
	plhs[0] = mxCreateDoubleMatrix(mx,ny,mxCOMPLEX);
	/*Crea un puntatore C alla copia della matrice di output*/
	zr = mxGetPr(plhs[0]);
	zi = mxGetPi(plhs[0]);
	/*Chiama la subroutine C*/
	mxm(xr,xi,yr,yi,zr,zi,mx,nx,my,ny);
}

