/*
    PsychAllocOutCellArray()
    
    -If argument is optional we allocate the structure even if the argument is not present.  If this behavior bothers you, 
    then check within your code for the presense of a return argument before creating the struct array.  We
    allocate space regardeless of whether the argument is present because this is consistant with other "PsychAllocOut*" 
    functions which behave this way because in some situations subfunctions might derive returned results from values
    stored in an optional argument.
    
    -If position is -1 then don't attempt to return the created structure to the calling environment.  Instead just 
    allocate the structure and return it in pStruct.  This is how to create a structure which is embeded within another 
    structure using PsychSetStructArrayStructArray().  Note that we use -1 as the flag and not NULL because NULL is 0 and
    0 is reserved for future use as a reference to the subfunction name, of if none then the function name. 
    

*/
boolean PsychAllocOutCellVector(	int position, 
									PsychArgRequirementType isRequired, 
									int numElements,  
									PsychGenericScriptType **pCell)
{
    mxArray **mxArrayOut;
    int cellArrayNumDims=2;
    int cellArrayDims[2];
	PsychError matchError;
	Boolean putOut;

    
    cellArrayDims[0]=1;
    cellArrayDims[1]=numElements;
    
    if(position != kPsychNoArgReturn){  //Return the result to both the C caller and the scripting environment.
        PsychSetReceivedArgDescriptor(position, PsychArgOut);
        PsychSetSpecifiedArgDescriptor(position, PsychArgOut, PsychArgType_cellArray, isRequired, 1,1,numElements,numElements,0,0);
        *pCell = mxCreateCellArray(cellArrayNumDims, cellArrayDims);
        mxArrayOut = PsychGetOutArgMxPtr(position);
		matchError=PsychMatchDescriptors();
		putOut=PsychAcceptOutputArgumentDecider(isRequired, matchError);
		if(putOut)
            *mxArrayOut=*pCell;
        return(putOut);
    }else{ //Return the result only to the C caller, not to the calling environment.  Ignore "required".    
        *pCell = mxCreateCellArray(cellArrayNumDims, cellArrayDims);
        return(TRUE);
    }
            
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
	int     i, j, c, loop, nNodes, nCliques, ndomain, dims[2];
	double  *pClqs, *pr, *pt, *pSize;
	mxArray *pTemp, *pTemp1, *pStruct, *pCliques, *pBigpot, *pSmallpot;
	const char *field_names[] = {"domain", "T", "sizes"};

	nNodes = mxGetNumberOfElements(prhs[1]);
	pCliques = mxGetField(prhs[0], 0, "cliques");
	nCliques = mxGetNumberOfElements(pCliques);
	pTemp = mxGetField(prhs[0], 0, "eff_node_sizes");
	pSize = mxGetPr(pTemp);

	plhs[0] = mxCreateCellArray(1, &nCliques);
    for(i=0; i<nCliques; i++){
        pStruct = mxCreateStructMatrix(1, 1, 3, field_names);
		mxSetCell(plhs[0], i, pStruct);
		pTemp = mxGetCell(pCliques, i);
		ndomain = mxGetNumberOfElements(pTemp);
		pt = mxGetPr(pTemp);
		pTemp1 = mxDuplicateArray(pTemp);
		mxSetField(pStruct, 0, "domain", pTemp1);
		
		pTemp = mxCreateDoubleMatrix(1, ndomain, mxREAL);
		mxSetField(pStruct, 0, "sizes", pTemp);
		pr = mxGetPr(pTemp);
        for(j=0; j<ndomain; j++){
            pr[j] = pSize[(int)pt[j]-1];
        }
    }

	pClqs = mxGetPr(prhs[1]);
	for(loop=0; loop<nNodes; loop++){
		c = (int)pClqs[loop] - 1;
		pSmallpot = mxGetCell(prhs[2], loop);
		pTemp = mxGetField(pSmallpot, 0, "T");
		pBigpot = mxGetCell(plhs[0], c);
		pTemp1 = mxGetField(pBigpot, 0, "T");
		if(pTemp1){
			if(mxIsSparse(pTemp))
				multiply_spPot_by_spPot(pBigpot, pSmallpot);
			else multiply_spPot_by_fuPot(pBigpot, pSmallpot);
		}
		else{
			if(mxIsSparse(pTemp))
				multiply_null_by_spPot(pBigpot, pSmallpot);
			else multiply_null_by_fuPot(pBigpot, pSmallpot);
		}		
	}

	dims[0] = nCliques;
	dims[1] = nCliques;
	plhs[1] = mxCreateCellArray(2, dims);
}
void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
     char *dir_name;
     mxArray **files;
     int nfiles, i;

     if (nlhs > 1)
          mexErrMsgTxt("Too many output arguments.");
     
     if (nrhs == 0)
          dir_name = ".";
     else if (nrhs == 1) {
          if (mxIsChar(prhs[0]) != 1)
               mexErrMsgTxt("Input must be a string.");
          if (mxGetM(prhs[0]) != 1)
               mexErrMsgTxt("Input must be a row vector.");
          dir_name = mxArrayToString(prhs[0]);
     } else
          mexErrMsgTxt("Too many input arguments.");

     files = dir(dir_name, &nfiles);

     plhs[0] = mxCreateCellArray(1,&nfiles);

     for (i = 0; i < nfiles; i++) {
          mxSetCell(plhs[0],i,files[i]);
     }

     mxFree(files);
     if (nrhs > 0)
          mxFree(dir_name);
     return;
}
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray *prhs[])
{
  if(nrhs!=3 || nlhs != 8)
  {
    mexErrMsgIdAndTxt("Drake:testMultipleTimeLinearPostureConstrainttmex:BadInputs","Usage [num_cnst,cnst_val,iAfun,jAvar,A,cnst_name,lb,ub] = testMultipleTimeLinearPostureConstraintmex(kinCnst,q,t)");
  }
  MultipleTimeLinearPostureConstraint* cnst = (MultipleTimeLinearPostureConstraint*) getDrakeMexPointer(prhs[0]);
  int n_breaks = mxGetNumberOfElements(prhs[2]);
  double* t_ptr = new double[n_breaks];
  memcpy(t_ptr,mxGetPrSafe(prhs[2]),sizeof(double)*n_breaks);
  int nq = cnst->getRobotPointer()->num_positions;
  MatrixXd q(nq,n_breaks);
  if(mxGetM(prhs[1]) != nq || mxGetN(prhs[1]) != n_breaks)
  {
    mexErrMsgIdAndTxt("Drake:testMultipleTimeLinearPostureConstraintmex:BadInputs","Argument 2 must be of size nq*n_breaks");
  }
  memcpy(q.data(),mxGetPrSafe(prhs[1]),sizeof(double)*nq*n_breaks); 
  int num_cnst = cnst->getNumConstraint(t_ptr,n_breaks); 
  VectorXd c(num_cnst);
  cnst->feval(t_ptr,n_breaks,q,c);
  VectorXi iAfun;
  VectorXi jAvar;
  VectorXd A;
  cnst->geval(t_ptr,n_breaks,iAfun,jAvar,A);
  std::vector<std::string> cnst_names;
  cnst->name(t_ptr,n_breaks,cnst_names);
  VectorXd lb(num_cnst);
  VectorXd ub(num_cnst);
  cnst->bounds(t_ptr,n_breaks,lb,ub);
  VectorXd iAfun_tmp(iAfun.size());
  VectorXd jAvar_tmp(jAvar.size());
  for(int i = 0;i<iAfun.size();i++)
  {
    iAfun_tmp(i) = (double) iAfun(i)+1;
    jAvar_tmp(i) = (double) jAvar(i)+1;
  }
  plhs[0] = mxCreateDoubleScalar((double) num_cnst);
  plhs[1] = mxCreateDoubleMatrix(num_cnst,1,mxREAL);
  memcpy(mxGetPrSafe(plhs[1]),c.data(),sizeof(double)*num_cnst);
  plhs[2] = mxCreateDoubleMatrix(iAfun_tmp.size(),1,mxREAL);
  memcpy(mxGetPrSafe(plhs[2]),iAfun_tmp.data(),sizeof(double)*iAfun_tmp.size());
  plhs[3] = mxCreateDoubleMatrix(jAvar_tmp.size(),1,mxREAL);
  memcpy(mxGetPrSafe(plhs[3]),jAvar_tmp.data(),sizeof(double)*jAvar_tmp.size());
  plhs[4] = mxCreateDoubleMatrix(A.size(),1,mxREAL);
  memcpy(mxGetPrSafe(plhs[4]),A.data(),sizeof(double)*A.size());
  int name_ndim = 1;
  mwSize name_dims[] = {(mwSize) num_cnst};
  plhs[5] = mxCreateCellArray(name_ndim,name_dims);
  mxArray *name_ptr;
  for(int i = 0;i<num_cnst;i++)
  {
    name_ptr = mxCreateString(cnst_names[i].c_str());
    mxSetCell(plhs[5],i,name_ptr);
  }
  plhs[6] = mxCreateDoubleMatrix(num_cnst,1,mxREAL);
  plhs[7] = mxCreateDoubleMatrix(num_cnst,1,mxREAL);
  memcpy(mxGetPrSafe(plhs[6]),lb.data(),sizeof(double)*num_cnst);
  memcpy(mxGetPrSafe(plhs[7]),ub.data(),sizeof(double)*num_cnst);
  delete[] t_ptr;
}
void mexFunction(int nlhs,mxArray* plhs[], int nrhs, const mxArray * prhs[])
{
  if(nrhs!=3 || nlhs != 7)
  {
    mexErrMsgIdAndTxt("Drake:testMultipleTimeKinCnstmex:BadInputs","Usage [type,num_cnst,cnst_val,dcnst_val,cnst_name,lb,ub] = testMultipleTimeKinCnstmex(kinCnst,q,t)");
  }
  MultipleTimeKinematicConstraint* cnst = (MultipleTimeKinematicConstraint*) getDrakeMexPointer(prhs[0]);
  int n_breaks = mxGetNumberOfElements(prhs[2]);
  double* t_ptr = new double[n_breaks];
  memcpy(t_ptr,mxGetPrSafe(prhs[2]),sizeof(double)*n_breaks);
  int nq = cnst->getRobotPointer()->num_positions;
  MatrixXd q(nq,n_breaks);
  if(mxGetM(prhs[1]) != nq || mxGetN(prhs[1]) != n_breaks)
  {
    mexErrMsgIdAndTxt("Drake:testMultipleTimeKinCnstmex:BadInputs","Argument 2 must be of size nq*n_breaks");
  }
  memcpy(q.data(),mxGetPrSafe(prhs[1]),sizeof(double)*nq*n_breaks); 
  int type = cnst->getType();
  int num_cnst = cnst->getNumConstraint(t_ptr,n_breaks); 
  VectorXd c(num_cnst);
  MatrixXd dc(num_cnst,nq*n_breaks);
  cnst->eval(t_ptr,n_breaks,q,c,dc);
  VectorXd lb(num_cnst);
  VectorXd ub(num_cnst);
  cnst->bounds(t_ptr,n_breaks,lb,ub);
  std::vector<std::string> cnst_names;
  cnst->name(t_ptr,n_breaks,cnst_names);
  int retvec_size;
  if(num_cnst == 0)
  {
    retvec_size = 0;
  }
  else
  {
    retvec_size = 1;
  }
  plhs[0] = mxCreateDoubleScalar((double) type);
  plhs[1] = mxCreateDoubleScalar((double) num_cnst);
  plhs[2] = mxCreateDoubleMatrix(num_cnst,retvec_size,mxREAL);
  memcpy(mxGetPrSafe(plhs[2]),c.data(),sizeof(double)*num_cnst);
  plhs[3] = mxCreateDoubleMatrix(num_cnst,nq*n_breaks,mxREAL);
  memcpy(mxGetPrSafe(plhs[3]),dc.data(),sizeof(double)*num_cnst*nq*n_breaks);
  int name_ndim = 1;
  mwSize name_dims[] = {(mwSize) num_cnst};
  plhs[4] = mxCreateCellArray(name_ndim,name_dims);
  mxArray *name_ptr;
  for(int i = 0;i<num_cnst;i++)
  {
    name_ptr = mxCreateString(cnst_names[i].c_str());
    mxSetCell(plhs[4],i,name_ptr);
  }
  plhs[5] = mxCreateDoubleMatrix(num_cnst,retvec_size,mxREAL);
  plhs[6] = mxCreateDoubleMatrix(num_cnst,retvec_size,mxREAL);
  memcpy(mxGetPrSafe(plhs[5]),lb.data(),sizeof(double)*num_cnst);
  memcpy(mxGetPrSafe(plhs[6]),ub.data(),sizeof(double)*num_cnst);
  delete[] t_ptr;
}
Exemple #6
0
inline
mxArray* to_mxarray(const array_nd<array_nd<T> >& a)
{
	mxArray* mx = mxCreateCellArray(a.ndims(),
		reinterpret_cast<const mwSize*>(a.sizes().get_base_ptr()));

	size_t len = a.length();
	for(size_t i = 0; i < len; i++) {
		mxSetCell(mx, mwIndex(i), to_mxarray(a[i]));
	}

	return mx;
}
mxArray*
Snapshot::StoreSnapshots0(vector<Snapshot>& snapshots)
{
	mxArray* plhs;
	const int dims[] = { snapshots.size(), 1 };
	plhs = mxCreateCellArray((mwSize)2, (const mwSize*)dims);
	for (int i = 0; i<snapshots.size(); ++i)
	{
		mxArray* a = StoreSnapshot0(snapshots[i]);
		mxSetCell(plhs, i, a);
	}
	return plhs;
}
Exemple #8
0
static int
p_create_cell_vector(void)
{
  mwSize dims[1];
  mxArray *mat;

  dims[0] = YAP_IntOfTerm(YAP_ARG1);
  if (!(mat = mxCreateCellArray(1, dims)))
    return FALSE;
  if (YAP_IsAtomTerm(YAP_ARG2)) {
    return !engPutVariable(Meng, YAP_AtomName(YAP_AtomOfTerm(YAP_ARG2)), mat);
  }
  return YAP_Unify(YAP_ARG2,address2term(mat));
}
Exemple #9
0
void eng_make_Cell(int *elems, int len, int *mmDims, int depth) {
    std::vector<mwSize> mbDimsVec(depth);
    std::reverse_copy(mmDims, mmDims+depth, mbDimsVec.begin());
    mwSize *mbDims = &mbDimsVec[0];

    mxArray *var = mxCreateCellArray(depth, mbDims);
    for (int i=0; i < len; ++i) {
        mxArray *el = handles.value(elems[i]);
        handles.remove(elems[i]); // remove to avoid double mxFree()
        mxSetCell(var, i, el);
    }

    returnHandle(var);
}
/**
 * Convert unknown python object to empty cell array.
 * Also send a warning with __repr__ of `obj` shown.
 *
 * :param obj: Object to convert [Borrow reference]
 */
mxArray *mx_from_py_unknown(PyObject* obj)
{
    int dims[1] = { 0 };
    char *buf;

    PyObject *type = PyObject_Type(obj);
    PyObject *repr = PyObject_Repr(type);
    buf = PyString_AsString(repr);
    
    mexWarnMsgTxt("Unknown Python object seen / conversion failed:");
    mexWarnMsgTxt(buf);

    Py_DECREF(repr);
    Py_DECREF(type);
    
    return mxCreateCellArray(1, dims);
}
/** Convert a numeric Python object array to a Matlab cell array
 * :param obj: Object to convert [Borrow reference]
 */
mxArray *mx_from_py_arrayobject_object(PyArrayObject* obj)
{
    stride_t s;
    unsigned long index;
    PyObject **r;
    mxArray *arr;
    
    arr = mxCreateCellArray(obj->nd, (int*)obj->dimensions);
    if (!stride_init(obj->data, obj->nd, obj->dimensions, obj->strides, &s))
        return arr;

    index = 0;
    do {
        r = (PyObject**)stride_pos(&s);
        mxSetCell(arr, index, mx_from_py(*r));
        ++index;
    } while (stride_step(&s));

    return arr;
}
/** Convert Python sequence to 1D Matlab cell array
 * :param obj: Object to convert [Borrow reference]
 */
mxArray *mx_from_py_sequence(PyObject* obj)
{
    mxArray *r;
    int dims[1];
    int k;
    dims[0] = PySequence_Size(obj);
    r = mxCreateCellArray(1, dims);
    for (k = 0; k < dims[0]; ++k) {
        PyObject *o;
        o = PySequence_GetItem(obj, k);
        if (o == NULL) {
            mexWarnMsgTxt("Couldn't get item in sequence");
            PyErr_Clear();
        } else {
            mxSetCell(r, k, mx_from_py(o));
            Py_DECREF(o);
        }
    }
    return r;
}
mxArray* sf_c1_VrSubsystem_get_post_codegen_info(void)
{
  const char* fieldNames[] = { "exportedFunctionsUsedByThisChart",
    "exportedFunctionsChecksum" };

  mwSize dims[2] = { 1, 1 };

  mxArray* mxPostCodegenInfo = mxCreateStructArray(2, dims, sizeof(fieldNames)/
    sizeof(fieldNames[0]), fieldNames);

  {
    mxArray* mxExportedFunctionsChecksum = mxCreateString("");
    mwSize exp_dims[2] = { 0, 1 };

    mxArray* mxExportedFunctionsUsedByThisChart = mxCreateCellArray(2, exp_dims);
    mxSetField(mxPostCodegenInfo, 0, "exportedFunctionsUsedByThisChart",
               mxExportedFunctionsUsedByThisChart);
    mxSetField(mxPostCodegenInfo, 0, "exportedFunctionsChecksum",
               mxExportedFunctionsChecksum);
  }

  return mxPostCodegenInfo;
}
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
    double   *m_w_d, *p_w_z, *p_z_d, *p_w_d;
    mwIndex  *ir, *jc;
    size_t   d, k;
    size_t   n_w, n_d, n_z;
    mwSize   ndim = 1, dims[1];
    mwSize   nsubs = 1;
    mxArray  *temp_array;
    double   *temp;
    size_t   beg_row_id, end_row_id, cur_row_id;
    mwIndex  index, subs[1];
    mwIndex  *beg_of_ir, *beg_of_jc;
    mwSize   nzmax;
    size_t total = 0;
    
    
    if(!mxIsSparse(prhs[0]))
    {
        printf("word-doc matrix should be sparse matrix\n");
        return;
    }
    else if(nrhs != 4 || nlhs != 1)
    {
        printf("usage: p_z_wd = mex_Estep_sparse(m_w_d, p_w_z_n, p_z_d_n, p_w_d)\n");
        return;
    }
    
    m_w_d = mxGetPr(prhs[0]);
    jc = mxGetJc(prhs[0]);
    ir = mxGetIr(prhs[0]);
    nzmax = mxGetNzmax(prhs[0]);
    
    n_w = mxGetM(prhs[0]);
    n_d = mxGetN(prhs[0]);

    p_w_z = mxGetPr(prhs[1]);
    n_z = mxGetN(prhs[1]);
    
    
    
    p_z_d = mxGetPr(prhs[2]);
    
    p_w_d = mxGetPr(prhs[3]);
    
    dims[0] = n_z;
    plhs[0] = mxCreateCellArray(ndim, dims);
    //total_num_of_cells = mxGetNumberOfElements(plhs[0]);
    
    for(k = 0; k < n_z; k++)
    {
        total = 0;
        subs[0] = k;
        index = mxCalcSingleSubscript(plhs[0], nsubs, subs);
        
        temp_array = mxCreateSparse(n_w, n_d, nzmax, mxREAL);
        temp = mxGetPr(temp_array);
        mxSetNzmax(temp_array, nzmax);
        
        //Place ir data into the newly created sparse array.
        beg_of_ir = mxGetIr(temp_array);
        memcpy(beg_of_ir, ir, nzmax * sizeof(mwIndex));
        
        //Place jc data into the newly created sparse array.
        beg_of_jc = mxGetJc(temp_array);
        memcpy(beg_of_jc, jc, (n_d + 1) * sizeof(mwIndex));
        
        for (d = 0; d < n_d; d++)
        {
            beg_row_id = jc[d];
            end_row_id = jc[d + 1];
            
            if (beg_row_id == end_row_id)
                continue;
            else
            {
                for (cur_row_id = beg_row_id; cur_row_id < end_row_id; cur_row_id++)
                {
                    temp[total] = p_w_z[k * n_w + ir[cur_row_id]] * p_z_d[d * n_z + k] / p_w_d[total];
                    total++;
                }
            }
        }
        
        mxSetCell(plhs[0], index, temp_array);
    }
    return;
}
mxArray *dynListToCellArray(DYN_LIST *dl)
{
  int dims;
  int i;
  DYN_LIST **sublists;
  mxArray *retval = NULL, *cell;
  double *d;

  switch(DYN_LIST_DATATYPE(dl)) {
  case DF_LIST:
    dims = DYN_LIST_N(dl);
    retval = mxCreateCellArray(1, (const mwSize*)&dims);
    sublists = (DYN_LIST **) DYN_LIST_VALS(dl);
    for (i = 0; i < DYN_LIST_N(dl); i++) {
      cell = dynListToCellArray(sublists[i]);
      mxSetCell(retval, i, cell);
    }
    break;
  case DF_INT:
    {
      int *vals = (int *) DYN_LIST_VALS(dl);
      retval = mxCreateDoubleMatrix(DYN_LIST_N(dl), 1, mxREAL);
      d = mxGetPr(retval);
      for ( i = 0; i < DYN_LIST_N(dl); i++ ) 
	d[i] = (double) vals[i];
    }
    break;
  case DF_SHORT:
    {
      short *vals = (short *) DYN_LIST_VALS(dl);
      retval = mxCreateDoubleMatrix(DYN_LIST_N(dl), 1, mxREAL);
      d = mxGetPr(retval);
      for ( i = 0; i < DYN_LIST_N(dl); i++ ) 
	d[i] = (double) vals[i];
    }
    break;
  case DF_FLOAT:
    {
      float *vals = (float *) DYN_LIST_VALS(dl);
      retval = mxCreateDoubleMatrix(DYN_LIST_N(dl), 1, mxREAL);
      d = mxGetPr(retval);
      for ( i = 0; i < DYN_LIST_N(dl); i++ ) 
	d[i] = (double) vals[i];
    }
    break;
  case DF_CHAR:
    {
      char *vals = (char *) DYN_LIST_VALS(dl);
      retval = mxCreateDoubleMatrix(DYN_LIST_N(dl), 1, mxREAL);
      d = mxGetPr(retval);
      for ( i = 0; i < DYN_LIST_N(dl); i++ ) 
	d[i] = (double) vals[i];
    }
    break;
  case DF_STRING:
    {
      char **vals = (char **) DYN_LIST_VALS(dl);
      retval = mxCreateCharMatrixFromStrings(DYN_LIST_N(dl), (const char **)vals);
    }
  }
  return retval;
}
Exemple #16
0
// Main function ===============================================================
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
  const mxArray *In, *String;
  mxArray *Out;
  mwSize  iC;
  OutStyle_T OutStyle = Auto_Style;  // Default: Auto-expanding
  char    StyleIn;

  // Check number of inputs and outputs:
  if (nrhs == 0 || nrhs > 2 || nlhs > 1) {
     mexErrMsgIdAndTxt(ERR_ID   "BadNInput",
                       ERR_HEAD "2 inputs allowed, 1 output allowed.");
  }

  // Parse 2nd input, if it is not empty:
  if (nrhs == 2 && !mxIsEmpty(prhs[1])) {
     if (!mxIsChar(prhs[1])) {
        mexErrMsgIdAndTxt(ERR_ID   "BadType",
                          ERR_HEAD "2nd input [Style] must be a string.");
     }

     // "Auto", "Lean", "Fat":
     StyleIn = *((char *) mxGetData(prhs[1]));
     switch (StyleIn) {
        case 'a':  // Fallthrough
        case 'A':  OutStyle = Auto_Style;  break;
        case 'l':  // Fallthrough
        case 'L':  OutStyle = Lean_Style;  break;
        case 'f':  // Fallthrough
        case 'F':  OutStyle = Fat_Style;   break;
        default:
           mexErrMsgIdAndTxt(ERR_ID   "BadStyle",
                             ERR_HEAD "Unknown Style.");
     }
  }

  // Get input string or cell string and call the core: ------------------------
  In = prhs[0];
  if (mxIsChar(In)) {                          // Input is a string:
     plhs[0] = Core((mxChar *) mxGetData(In), mxGetNumberOfElements(prhs[0]),
                    OutStyle);

  } else if (mxIsCell(In)) {                   // Input is a cell string:
     plhs[0] = mxCreateCellArray(mxGetNumberOfDimensions(In),
                                 mxGetDimensions(In));
     Out = plhs[0];
     iC  = mxGetNumberOfElements(In);
     while (iC-- > 0) {                        // Backwards, faster than FOR
        String = mxGetCell(In, iC);
        if (String == NULL) {                  // Uninitialized cell:
           mxSetCell(Out, iC,
                     Core(NULL, 0, OutStyle)); // Reply current directory
        } else if (mxIsChar(String)) {         // Cell element is a string
           mxSetCell(Out, iC,
                     Core((mxChar *) mxGetData(String),
                          mxGetNumberOfElements(String), OutStyle));
        } else {                               // Bad cell element
           mexErrMsgIdAndTxt(ERR_ID "BadInputType",
                        ERR_HEAD "[FileName] must be a string or cell string.");
        }
     }

  } else {                                     // Bad input type:
     mexErrMsgIdAndTxt(ERR_ID   "BadInputType",
                       ERR_HEAD "[FileName] must be a string or cell string.");
  }

  return;
}
/* entry point */
void mexFunction(int nlhs, mxArray *plhs[], 
                 int nrhs, const mxArray *prhs[])                
{
    int ind, i, x, y, o, dataDim, j, bytes_to_copy, nGaborFilter;
    const mxArray *f;
    const mxArray *pAS1Map;
    mxArray *outPA;
    mwSize ndim;
    const mwSize* dims;
    mwSize dimsOutput[2];
    void* start_of_pr;
    mxClassID datatype;

	/*
	 * input variable 0: nGaborOri
	 */
	nGaborOri = (int)mxGetScalar(prhs[0]);
 
    /*
	 * input variable 1: S1 maps
	 */
    pAS1Map = prhs[1];
    dims = mxGetDimensions(pAS1Map);
    nGaborFilter = dims[0] * dims[1];
    nGaborScale = nGaborFilter / nGaborOri;
 
    S1Map = (const float**)mxCalloc( nGaborFilter, sizeof(*S1Map) );   /* SUM1 maps */
    for (i=0; i<nGaborFilter; ++i)
    {
        f = mxGetCell(pAS1Map, i);
        datatype = mxGetClassID(f);
        if (datatype != mxSINGLE_CLASS)
            mexErrMsgTxt("warning !! single precision required.");
        S1Map[i] = (const float*)mxGetPr(f);    /* get the pointer to cell content */
        height = mxGetM(f);    /* overwriting is ok, since it is constant */
        width = mxGetN(f);
    }
    
    /*
     * input variable 2: location shift radius
     */
    locationPerturb = (int)mxGetScalar(prhs[2]);
    
    /*
     * input variable 3: orientation shift radius
     */
    orientationPerturb = (int)mxGetScalar(prhs[3]);
    
    /*
     * input variable 4: sub sample step length
     */
    subsample = (int)mxGetScalar(prhs[4]);

    StoreShift();
    Compute();
    
    /* =============================================
     * Handle output variables.
     * ============================================= 
     */
    
    /*
     * output variable 0: M1 map
     */
    dimsOutput[0] = 1; dimsOutput[1] = nGaborScale * nGaborOri;
	plhs[0] = mxCreateCellArray( 2, dimsOutput );
    dimsOutput[0] = sizexSubsample; dimsOutput[1] = sizeySubsample;
    for( i = 0; i < nGaborOri * nGaborScale; ++i )
    {
        outPA = mxCreateNumericArray( 2, dimsOutput, mxSINGLE_CLASS, mxREAL );
        /* populate the real part of the created array */
        start_of_pr = (float*)mxGetData(outPA);
        bytes_to_copy = dimsOutput[0] * dimsOutput[1] * mxGetElementSize(outPA);
        memcpy( start_of_pr, M1Map[i], bytes_to_copy );
        mxSetCell( plhs[0], i, outPA );
    }
    
    /*
     * output variable 1: M1 trace
     */
    dimsOutput[0] = 1; dimsOutput[1] = nGaborScale * nGaborOri;
	plhs[1] = mxCreateCellArray( 2, dimsOutput );
    dimsOutput[0] = sizexSubsample; dimsOutput[1] = sizeySubsample;
    for( i = 0; i < nGaborOri * nGaborScale; ++i )
    {
        outPA = mxCreateNumericArray( 2, dimsOutput, mxINT32_CLASS, mxREAL );
        /* populate the real part of the created array */
        start_of_pr = (int*)mxGetData(outPA);
        bytes_to_copy = dimsOutput[0] * dimsOutput[1] * mxGetElementSize(outPA);
        memcpy( start_of_pr, M1Trace[i], bytes_to_copy );
        mxSetCell( plhs[1], i, outPA );
    }
    
    /*
     * output variable 2: stored Gabor shifts : row shifts
     */
    dimsOutput[0] = nGaborScale * nGaborOri; dimsOutput[1] = 1;
    plhs[2] = mxCreateCellArray( 2, dimsOutput );
    for( i = 0; i < nGaborScale*nGaborOri; ++i )
    {
        dimsOutput[0] = numShift; dimsOutput[1] = 1;
        outPA = mxCreateNumericArray( 2, dimsOutput, mxINT32_CLASS, mxREAL );
        start_of_pr = (int*)mxGetData(outPA);
        bytes_to_copy = dimsOutput[0] * dimsOutput[1] * mxGetElementSize(outPA);
        memcpy( start_of_pr, rowShift[i], bytes_to_copy );
        mxSetCell( plhs[2], i, outPA );
    }
    
    /*
     * output variable 3: stored Gabor shifts : col shifts
     */
    dimsOutput[0] = nGaborScale * nGaborOri; dimsOutput[1] = 1;
    plhs[3] = mxCreateCellArray( 2, dimsOutput );
    for( i = 0; i < nGaborScale*nGaborOri; ++i )
    {
        dimsOutput[0] = numShift; dimsOutput[1] = 1;
        outPA = mxCreateNumericArray( 2, dimsOutput, mxINT32_CLASS, mxREAL );
        start_of_pr = (int*)mxGetData(outPA);
        bytes_to_copy = dimsOutput[0] * dimsOutput[1] * mxGetElementSize(outPA);
        memcpy( start_of_pr, colShift[i], bytes_to_copy );
        mxSetCell( plhs[3], i, outPA );
    }
    
    /*
     * output variable 4: stored Gabor shifts : orientation shifts
     */
    dimsOutput[0] = nGaborScale * nGaborOri; dimsOutput[1] = 1;
    plhs[4] = mxCreateCellArray( 2, dimsOutput );
    for( i = 0; i < nGaborScale*nGaborOri; ++i )
    {
        dimsOutput[0] = numShift; dimsOutput[1] = 1;
        outPA = mxCreateNumericArray( 2, dimsOutput, mxINT32_CLASS, mxREAL );
        start_of_pr = (int*)mxGetData(outPA);
        bytes_to_copy = dimsOutput[0] * dimsOutput[1] * mxGetElementSize(outPA);
        memcpy( start_of_pr, orientShift[i], bytes_to_copy );
        mxSetCell( plhs[4], i, outPA );
    }
}
void
mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    MatlabCPPInitialize(false);

    // Check for proper number of arguments
    if ( (nrhs < NR_IN) || (nrhs > NR_IN + NR_IN_OPT) || \
            (nlhs < NR_OUT) || (nlhs > NR_OUT + NR_OUT_OPT) ) {
        mexErrMsgTxt("Wrong number of arguments.");
    }

    // fetch the input (we support matrices and cell arrays)
    std::vector< Eigen::VectorXd > theta_unary;
    std::vector< Eigen::VectorXd > theta_pair;

    if (!mxIsCell(THETA_UNARY_IN)) {
        GetMatlabPotentialFromMatrix(THETA_UNARY_IN, theta_unary);
        GetMatlabPotentialFromMatrix(THETA_PAIR_IN, theta_pair);
    }
    else {
        GetMatlabPotential(THETA_UNARY_IN, theta_unary);
        GetMatlabPotential(THETA_PAIR_IN, theta_pair);
    }
    
    Eigen::MatrixXi edges;
    GetMatlabMatrix(EDGES_IN, edges);

    // decomposition: cell array of edge index vectors
    std::vector< std::vector<size_t> > decomposition;
    size_t num = mxGetNumberOfElements(DECOMPOSITION_IN);
    decomposition.resize(num);
    for (size_t d_idx=0; d_idx<num; d_idx++) {
        const mxArray* v = mxGetCell(DECOMPOSITION_IN, d_idx);
        size_t num_edges = mxGetM(v);
        decomposition[d_idx].resize(num_edges);
	    const double* ptr = mxGetPr(v);
        for (size_t e_idx=0; e_idx<num_edges; e_idx++) {
            decomposition[d_idx][e_idx] = static_cast<size_t>(ptr[e_idx]);
        }
    }
    
    // parse options
    MexSmoothDDOptions options;
    if (nrhs >= 5) {
        bool opts_parsed = options.parse(OPTIONS_IN);
        if (!opts_parsed) {
            MatlabCPPExit();
            return;
        }
    }
    
    // set algorithm & parameters according to options
    SmoothDualDecomposition* sdd;
    /*if (options.solver == SOLVER_FISTADESCENT) {
        sdd = new SmoothDualDecompositionFistaDescent(theta_unary, theta_pair, edges, decomposition);
    }
    if (options.solver == SOLVER_FISTA) {
        sdd = new SmoothDualDecompositionFista(theta_unary, theta_pair, edges, decomposition);
    }
    else if (options.solver == SOLVER_GRADIENTDESCENT) {
        sdd = new SmoothDualDecompositionGradientDescent(theta_unary, theta_pair, edges, decomposition);
    }
    else if (options.solver == SOLVER_NESTEROV) {
        sdd = new SmoothDualDecompositionNesterov(theta_unary, theta_pair, edges, decomposition);
    }
    else {
        mxAssert(0, "Solver not found. Should not happen!");
    }*/
    // TODO
    sdd = new SmoothDualDecompositionFistaDescent(theta_unary, theta_pair, edges, decomposition);
    //sdd = new SmoothDualDecompositionLBFGS(theta_unary, theta_pair, edges, decomposition);
    sdd->setMaximumNumberOfIterations(options.num_max_iter);
    sdd->setEpsilonGradientNorm(options.eps_gnorm);

    // run the computations
    sdd->run(options.rho);

    // return marginals (if input was provided as a matrix, also return
    // marginals in a matrix)
    std::vector< Eigen::VectorXd >& mu_unary = sdd->getUnaryMarginals();
    if (!mxIsCell(THETA_UNARY_IN)) {
        size_t num_states = mxGetM(THETA_UNARY_IN);
        size_t num_vars = mxGetN(THETA_UNARY_IN);
        MARGINALS_UNARY_OUT = mxCreateNumericMatrix(
                                num_states, 
                                num_vars,
                                mxDOUBLE_CLASS, mxREAL);
        double* mu_res_p = mxGetPr(MARGINALS_UNARY_OUT);
        for (size_t v_idx=0; v_idx<mu_unary.size(); v_idx++) {
            for (size_t idx=0; idx<mu_unary[v_idx].size(); idx++) {
                mu_res_p[v_idx*num_states+idx] = mu_unary[v_idx](idx);
            }
        }
    }
    else {
        mwSize dim_0 = static_cast<mwSize>(mu_unary.size());
        MARGINALS_UNARY_OUT = mxCreateCellArray(1, &dim_0);
        for (size_t v_idx=0; v_idx<mu_unary.size(); v_idx++) {
            mxArray* m = mxCreateNumericMatrix(
                            static_cast<int>(mu_unary[v_idx].size()),
                            1,
                            mxDOUBLE_CLASS, mxREAL);
            double* mu_res_p = mxGetPr(m);
            for (size_t idx=0; idx<mu_unary[v_idx].size(); idx++) {
                mu_res_p[idx] = mu_unary[v_idx](idx);
            }

            mxSetCell(MARGINALS_UNARY_OUT, v_idx, m);
        }
    }

    // return history
    /*if (nlhs > 1) {
        std::vector<double> history_obj = lpqp.getHistoryObjective();
        std::vector<double> history_obj_qp = lpqp.getHistoryObjectiveQP();
        std::vector<double> history_obj_lp = lpqp.getHistoryObjectiveLP();
        std::vector<double> history_obj_decoded = lpqp.getHistoryObjectiveDecoded();
        std::vector<size_t> history_iteration = lpqp.getHistoryIteration();
        std::vector<double> history_beta = lpqp.getHistoryBeta();
        std::vector< Eigen::VectorXi > history_decoded = lpqp.getHistoryDecoded();

        const char *field_names[] = {"obj", "obj_qp", "obj_lp", "obj_decoded", "iteration", "beta", "decoded"};
        mwSize dims[2];
        dims[0] = 1;
        dims[1] = history_obj.size();
        HISTORY_OUT = mxCreateStructArray(2, dims, sizeof(field_names)/sizeof(*field_names), field_names);

        int field_obj, field_obj_qp, field_obj_lp, field_obj_decoded, field_iteration, field_beta, field_decoded;
        field_obj = mxGetFieldNumber(HISTORY_OUT, "obj");
        field_obj_qp = mxGetFieldNumber(HISTORY_OUT, "obj_qp");
        field_obj_lp = mxGetFieldNumber(HISTORY_OUT, "obj_lp");
        field_obj_decoded = mxGetFieldNumber(HISTORY_OUT, "obj_decoded");
        field_iteration = mxGetFieldNumber(HISTORY_OUT, "iteration");
        field_beta = mxGetFieldNumber(HISTORY_OUT, "beta");
        field_decoded = mxGetFieldNumber(HISTORY_OUT, "decoded");

        for (size_t i=0; i<history_obj.size(); i++) {
            mxArray *field_value;

            field_value = mxCreateDoubleMatrix(1,1,mxREAL);
            *mxGetPr(field_value) = history_obj[i];
            mxSetFieldByNumber(HISTORY_OUT, i, field_obj, field_value);
            
            field_value = mxCreateDoubleMatrix(1,1,mxREAL);
            *mxGetPr(field_value) = history_obj_qp[i];
            mxSetFieldByNumber(HISTORY_OUT, i, field_obj_qp, field_value);
            
            field_value = mxCreateDoubleMatrix(1,1,mxREAL);
            *mxGetPr(field_value) = history_obj_lp[i];
            mxSetFieldByNumber(HISTORY_OUT, i, field_obj_lp, field_value);
            
            field_value = mxCreateDoubleMatrix(1,1,mxREAL);
            *mxGetPr(field_value) = history_obj_decoded[i];
            mxSetFieldByNumber(HISTORY_OUT, i, field_obj_decoded, field_value);
            
            field_value = mxCreateDoubleMatrix(1,1,mxREAL);
            *mxGetPr(field_value) = static_cast<double>(history_iteration[i]);
            mxSetFieldByNumber(HISTORY_OUT, i, field_iteration, field_value);
            
            field_value = mxCreateDoubleMatrix(1,1,mxREAL);
            *mxGetPr(field_value) = history_beta[i];
            mxSetFieldByNumber(HISTORY_OUT, i, field_beta, field_value);
            
            if (options.with_decoded_history) {
                field_value = mxCreateDoubleMatrix(history_decoded[i].size(),1,mxREAL);
                double* decoded_res_p = mxGetPr(field_value);
                for (size_t idx=0; idx<history_decoded[i].size(); idx++) {
                    decoded_res_p[idx] = static_cast<double>(history_decoded[i][idx]);
                }
                mxSetFieldByNumber(HISTORY_OUT, i, field_decoded, field_value);
            }
        }
    }*/
    
    // return pairwise marginals
    if (nlhs > 1) {
        std::vector< Eigen::VectorXd >& mu_pair = sdd->getPairwiseMarginals();
        if (!mxIsCell(THETA_UNARY_IN)) {
            size_t num_states = mxGetM(THETA_PAIR_IN);
            size_t num_edges = mxGetN(THETA_PAIR_IN);
            MARGINALS_PAIR_OUT = mxCreateNumericMatrix(
                                    num_states, 
                                    num_edges,
                                    mxDOUBLE_CLASS, mxREAL);
            double* mu_res_p = mxGetPr(MARGINALS_PAIR_OUT);
            for (size_t e_idx=0; e_idx<mu_pair.size(); e_idx++) {
                for (size_t idx=0; idx<mu_pair[e_idx].size(); idx++) {
                    mu_res_p[e_idx*num_states+idx] = mu_pair[e_idx](idx);
                }
            }
        }
        else {
            mwSize dim_0 = static_cast<mwSize>(mu_pair.size());
            MARGINALS_PAIR_OUT = mxCreateCellArray(1, &dim_0);
            for (size_t e_idx=0; e_idx<mu_pair.size(); e_idx++) {
                mxArray* m = mxCreateNumericMatrix(
                                static_cast<int>(mu_pair[e_idx].size()),
                                1,
                                mxDOUBLE_CLASS, mxREAL);
                double* mu_res_p = mxGetPr(m);
                for (size_t idx=0; idx<mu_pair[e_idx].size(); idx++) {
                    mu_res_p[idx] = mu_pair[e_idx](idx);
                }

                mxSetCell(MARGINALS_PAIR_OUT, e_idx, m);
            }
        }
    }

    delete sdd;

    MatlabCPPExit();
}
Exemple #19
0
void mexFunction(int nlhs,       mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
  char buf[MAXLENGTH];
  char numStr[20];
  double x,y,z,tx,ty,tz;
  double *pwrench,*ploc,*perr,*pind;
  int i,j,numBodies,numContacts;
  int sockd;
  mxArray *wrench,*loc,*err;

  /* Check for proper number of arguments */
  
  if (nrhs > 1) {
    mexErrMsgTxt("get average contacts takes at most one input argument.");
  } else if (nlhs > 3) {
    mexErrMsgTxt("get average contacts takes at most three output arguments.");
  }

  sockd = ConnectTo("localhost",4765);

  if (sockd < 0)
    mexErrMsgTxt("Could not connect");

  // send how many types of date we're collecting
  if (nlhs == 0 ) nlhs=1;
  sprintf(buf,"getContacts %d ",nlhs);

  // if no bodies were specified by user, read total number of bodies
  if (nrhs==0) {
	strcat(buf,"ALL\n");
	Writeline(sockd,buf,strlen(buf));

    Readline(sockd,buf,MAXLENGTH);
    sscanf(buf,"%d\n",&numBodies);
  }
  // otherwise send the body list
  else {
	numBodies = mxGetNumberOfElements(prhs[0]);
	if (numBodies>0) {
	  sprintf(numStr,"%d ",numBodies);
	  strcat(buf,numStr);

	  pind = mxGetPr(prhs[0]);
	  for (i=0;i<numBodies-1;i++) {
	    sprintf(numStr,"%d ",(int)pind[i]-1);
  		strcat(buf,numStr);
	  }
	  sprintf(numStr,"%d\n",(int)pind[i]-1);
	  strcat(buf,numStr);
	  Writeline(sockd,buf,strlen(buf));
	}
  }

  if (numBodies == 0) {
	plhs[0] = NULL;
	plhs[0] = NULL;
  }
  else {
	if (numBodies > 1){
	  for (i=0;i<nlhs;i++)
        plhs[i] = mxCreateCellArray(1,&numBodies);
    }
	
    for (i=0;i<numBodies;i++) {
	  Readline(sockd,buf,MAXLENGTH);
      sscanf(buf,"%d\n",&numContacts);

	  if (numContacts == 0) {
		wrench = mxCreateScalarDouble(0);
		if (nlhs > 1) {loc = mxCreateScalarDouble(0);}
	    if (nlhs > 2) {err = mxCreateScalarDouble(0);}
	  }
	  else {
	    wrench = mxCreateDoubleMatrix(numContacts,6,mxREAL);
	    pwrench = mxGetPr(wrench);
	    if (nlhs > 1) {loc = mxCreateDoubleMatrix(numContacts,3,mxREAL); ploc=mxGetPr(loc);}
	    if (nlhs > 2) {err = mxCreateDoubleMatrix(numContacts,1,mxREAL); perr=mxGetPr(err);}
      }

      for (j=0;j<numContacts;j++) {
        Readline(sockd,buf,MAXLENGTH);
        sscanf(buf,"%lf %lf %lf %lf %lf %lf\n",&x,&y,&z,&tx,&ty,&tz);
        pwrench[j] = x;
        pwrench[numContacts+j] = y;
        pwrench[2*numContacts+j] = z;
        pwrench[3*numContacts+j] = tx;
        pwrench[4*numContacts+j] = ty;
        pwrench[5*numContacts+j] = tz;
		if (nlhs > 1) {
		  Readline(sockd,buf,MAXLENGTH);
		  sscanf(buf,"%lf %lf %lf\n",&x,&y,&z);

  	      ploc[j] = x;
	      ploc[numContacts+j] = y;
	      ploc[2*numContacts+j] = z;
		}
		if (nlhs > 2) {
		  Readline(sockd,buf,MAXLENGTH);
		  sscanf(buf,"%lf\n",perr+j);
        }
	  }
	  if (numBodies == 1) {
		plhs[0] = wrench;
        if (nlhs > 1) plhs[1] = loc;
        if (nlhs > 2) plhs[2] = err;
	  } else {
	    mxSetCell(plhs[0],i,wrench);
	    if (nlhs > 1) mxSetCell(plhs[1],i,loc);
	    if (nlhs > 2) mxSetCell(plhs[2],i,err);
	  }
	}
  }

  CloseConnection(sockd);
  return;

}
/*
 * [type, num_constraint, constraint_val, dconstraint_val, constraint_name, lower_bound, upper_bound]
 * = testSingleTimeKinCnstmex(kinCnst_ptr, q, t)
 * @param kinCnst_ptr           A pointer to a SingleTimeKinematicConstraint
 * object
 * @param q                     A nqx1 double vector
 * @param t                     A double scalar, the time to evaluate constraint
 * value, bounds and name. This is optional.
 * @retval type                 The type of the constraint
 * @retval num_constraint       The number of constraint active at time t
 * @retval constraint_val       The value of the constraint at time t
 * @retval dconstraint_val      The gradient of the constraint w.r.t q at time t
 * @retval constraint_name      The name of the constraint at time t
 * @retval lower_bound          The lower bound of the constraint at time t
 * @retval upper_bound          The upper bound of the constraint at time t
 * */
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) {
  if ((nrhs != 3 && nrhs != 2) || nlhs != 7) {
    mexErrMsgIdAndTxt("Drake:testSingleTimeKinCnstmex:BadInputs",
                      "Usage [type, "
                      "num_cnst, cnst_val, dcnst_val, cnst_name, lb, ub] = "
                      "testSingleTimeKinKinCnstmex(kinCnst, q, t)");
  }
  SingleTimeKinematicConstraint* cnst =
      (SingleTimeKinematicConstraint*)getDrakeMexPointer(prhs[0]);
  double* t_ptr;
  if (nrhs == 2) {
    t_ptr = nullptr;
  } else {
    size_t num_t = mxGetNumberOfElements(prhs[2]);
    if (num_t == 0) {
      t_ptr = nullptr;
    }
    if (num_t == 1) {
      t_ptr = mxGetPrSafe(prhs[2]);
    }
    if (num_t > 1) {
      mexErrMsgIdAndTxt("Drake:testSingleTimeKinCnstmex:BadInputs",
                        "t must be either empty or a single number");
    }
  }
  int type = cnst->getType();
  int num_cnst = cnst->getNumConstraint(t_ptr);
  // mexPrintf("num_cnst = %d\n", num_cnst);
  int nq = cnst->getRobotPointer()->number_of_positions();
  Eigen::Map<Eigen::VectorXd> q(mxGetPrSafe(prhs[1]), nq);
  KinematicsCache<double> cache = cnst->getRobotPointer()->doKinematics(q);
  Eigen::VectorXd c(num_cnst);
  Eigen::MatrixXd dc(num_cnst, nq);
  cnst->eval(t_ptr, cache, c, dc);
  // mexPrintf("get c, dc\n");
  Eigen::VectorXd lb(num_cnst);
  Eigen::VectorXd ub(num_cnst);
  cnst->bounds(t_ptr, lb, ub);
  // mexPrintf("get lb, ub\n");
  std::vector<std::string> cnst_names;
  cnst->name(t_ptr, cnst_names);
  // mexPrintf("get name\n");
  int retvec_size;
  if (num_cnst == 0) {
    retvec_size = 0;
  } else {
    retvec_size = 1;
  }
  plhs[0] = mxCreateDoubleScalar((double)type);
  plhs[1] = mxCreateDoubleScalar((double)num_cnst);
  plhs[2] = mxCreateDoubleMatrix(num_cnst, retvec_size, mxREAL);
  memcpy(mxGetPrSafe(plhs[2]), c.data(), sizeof(double) * num_cnst);
  plhs[3] = mxCreateDoubleMatrix(num_cnst, nq, mxREAL);
  memcpy(mxGetPrSafe(plhs[3]), dc.data(), sizeof(double) * num_cnst * nq);
  int name_ndim = 1;
  mwSize name_dims[] = {(mwSize)num_cnst};
  plhs[4] = mxCreateCellArray(name_ndim, name_dims);
  mxArray* name_ptr;
  for (int i = 0; i < num_cnst; i++) {
    name_ptr = mxCreateString(cnst_names[i].c_str());
    mxSetCell(plhs[4], i, name_ptr);
  }
  plhs[5] = mxCreateDoubleMatrix(num_cnst, retvec_size, mxREAL);
  plhs[6] = mxCreateDoubleMatrix(num_cnst, retvec_size, mxREAL);
  memcpy(mxGetPrSafe(plhs[5]), lb.data(), sizeof(double) * num_cnst);
  memcpy(mxGetPrSafe(plhs[6]), ub.data(), sizeof(double) * num_cnst);
}
Exemple #21
0
void mexFunction(int nlhs,       mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
  char buf[MAXLENGTH];
  char numStr[20];
  double value;
  double *pvals,*pind;
  int i,j,numRobots,numDOF;
  int sockd;
  mxArray *vals;

  /* Check for proper number of arguments */
  
  if (nrhs > 1) {
    mexErrMsgTxt("getDOFVals takes at most one input argument.");
  } else if (nlhs > 1) {
    mexErrMsgTxt("getDOFVals takes one output argument.");
  }
  if (nlhs == 0 ) nlhs=1;

  sockd = ConnectTo("localhost",4765);

  if (sockd < 0)
    mexErrMsgTxt("Could not connect");
 
  strcpy(buf,"getDOFVals ");

  // if no robots were specified by user, read total number of robots
  if (nrhs==0) {
	strcat(buf,"ALL\n");
	Writeline(sockd,buf,strlen(buf));

    Readline(sockd,buf,MAXLENGTH);
    sscanf(buf,"%d\n",&numRobots);
  }
  // otherwise send the body list
  else {
	numRobots = mxGetNumberOfElements(prhs[0]);
	if (numRobots>0) {
	  sprintf(numStr,"%d ",numRobots);
	  strcat(buf,numStr);

	  pind = mxGetPr(prhs[0]);
	  for (i=0;i<numRobots-1;i++) {
	    sprintf(numStr,"%d ",(int)pind[i]-1);
  		strcat(buf,numStr);
	  }
	  sprintf(numStr,"%d\n",(int)pind[i]-1);
	  strcat(buf,numStr);
	  Writeline(sockd,buf,strlen(buf));
	}
  }

  if (numRobots == 0) {
	plhs[0] = NULL;
	plhs[0] = NULL;
  }
  else {
	if (numRobots > 1){
	  for (i=0;i<nlhs;i++)
        plhs[i] = mxCreateCellArray(1,&numRobots);
    }
	
    for (i=0;i<numRobots;i++) {
	  Readline(sockd,buf,MAXLENGTH);
	   if (!strncmp(buf,"Error",5)) {
		mexErrMsgTxt(buf);
		break;
	  }

      sscanf(buf,"%d\n",&numDOF);
	  sprintf(buf,"NumDOF read: %d",numDOF);

	  if (numDOF == 0) {
		vals = mxCreateScalarDouble(0);
	  }
	  else {
	    vals = mxCreateDoubleMatrix(numDOF,1,mxREAL);
	    pvals = mxGetPr(vals);
      }
      for (j=0;j<numDOF;j++) {
        Readline(sockd,buf,MAXLENGTH);
        sscanf(buf,"%lf\n",&value);
        pvals[j] = value;
	  }
	  if (numRobots == 1) {
		plhs[0] = vals;
	  } else {
	    mxSetCell(plhs[0],i,vals);
	  }
	}
  }

  CloseConnection(sockd);
  return;
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
  int i, j;
  mxArray *xm, *cell, *xm_cell;
  double *src;
  double *dest;
  double *dest_cell;
  int valid_vars;
  int steps;
  int this_var_errors;
  int warned_diags;
  int prepare_for_c = 0;
  int extra_solves;
  const char *status_names[] = {"optval", "gap", "steps", "converged"};
  mwSize dims1x1of1[1] = {1};
  mwSize dims[1];
  const char *var_names[] = {"u_0", "u_1", "u_2", "u_3", "u_4", "u_5", "u_6", "u_7", "u_8", "u_9", "u_10", "u_11", "u_12", "u_13", "u_14", "u_15", "u_16", "u_17", "u_18", "u_19", "u_20", "x_1", "x_2", "x_3", "x_4", "x_5", "x_6", "x_7", "x_8", "x_9", "x_10", "x_11", "x_12", "x_13", "x_14", "x_15", "x_16", "x_17", "x_18", "x_19", "x_20", "x_21", "u", "x"};
  const int num_var_names = 44;
  /* Avoid compiler warnings of unused variables by using a dummy assignment. */
  warned_diags = j = 0;
  extra_solves = 0;
  set_defaults();
  /* Check we got the right number of arguments. */
  if (nrhs == 0)
    mexErrMsgTxt("Not enough arguments: You need to specify at least the parameters.\n");
  if (nrhs > 1) {
    /* Assume that the second argument is the settings. */
    if (mxGetField(prhs[1], 0, "eps") != NULL)
      settings.eps = *mxGetPr(mxGetField(prhs[1], 0, "eps"));
    if (mxGetField(prhs[1], 0, "max_iters") != NULL)
      settings.max_iters = *mxGetPr(mxGetField(prhs[1], 0, "max_iters"));
    if (mxGetField(prhs[1], 0, "refine_steps") != NULL)
      settings.refine_steps = *mxGetPr(mxGetField(prhs[1], 0, "refine_steps"));
    if (mxGetField(prhs[1], 0, "verbose") != NULL)
      settings.verbose = *mxGetPr(mxGetField(prhs[1], 0, "verbose"));
    if (mxGetField(prhs[1], 0, "better_start") != NULL)
      settings.better_start = *mxGetPr(mxGetField(prhs[1], 0, "better_start"));
    if (mxGetField(prhs[1], 0, "verbose_refinement") != NULL)
      settings.verbose_refinement = *mxGetPr(mxGetField(prhs[1], 0,
            "verbose_refinement"));
    if (mxGetField(prhs[1], 0, "debug") != NULL)
      settings.debug = *mxGetPr(mxGetField(prhs[1], 0, "debug"));
    if (mxGetField(prhs[1], 0, "kkt_reg") != NULL)
      settings.kkt_reg = *mxGetPr(mxGetField(prhs[1], 0, "kkt_reg"));
    if (mxGetField(prhs[1], 0, "s_init") != NULL)
      settings.s_init = *mxGetPr(mxGetField(prhs[1], 0, "s_init"));
    if (mxGetField(prhs[1], 0, "z_init") != NULL)
      settings.z_init = *mxGetPr(mxGetField(prhs[1], 0, "z_init"));
    if (mxGetField(prhs[1], 0, "resid_tol") != NULL)
      settings.resid_tol = *mxGetPr(mxGetField(prhs[1], 0, "resid_tol"));
    if (mxGetField(prhs[1], 0, "extra_solves") != NULL)
      extra_solves = *mxGetPr(mxGetField(prhs[1], 0, "extra_solves"));
    else
      extra_solves = 0;
    if (mxGetField(prhs[1], 0, "prepare_for_c") != NULL)
      prepare_for_c = *mxGetPr(mxGetField(prhs[1], 0, "prepare_for_c"));
  }
  valid_vars = 0;
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "A");
  if (xm == NULL) {
    printf("could not find params.A.\n");
  } else {
    if (!((mxGetM(xm) == 8) && (mxGetN(xm) == 8))) {
      printf("A must be size (8,8), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter A must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter A must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter A must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.A;
      src = mxGetPr(xm);
      for (i = 0; i < 64; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "B");
  if (xm == NULL) {
    printf("could not find params.B.\n");
  } else {
    if (!((mxGetM(xm) == 8) && (mxGetN(xm) == 2))) {
      printf("B must be size (8,2), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter B must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter B must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter B must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.B;
      src = mxGetPr(xm);
      for (i = 0; i < 16; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "Ff");
  if (xm == NULL) {
    printf("could not find params.Ff.\n");
  } else {
    if (!((mxGetM(xm) == 1) && (mxGetN(xm) == 8))) {
      printf("Ff must be size (1,8), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter Ff must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter Ff must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter Ff must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.Ff;
      src = mxGetPr(xm);
      for (i = 0; i < 8; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "Fu");
  if (xm == NULL) {
    printf("could not find params.Fu.\n");
  } else {
    if (!((mxGetM(xm) == 4) && (mxGetN(xm) == 2))) {
      printf("Fu must be size (4,2), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter Fu must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter Fu must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter Fu must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.Fu;
      src = mxGetPr(xm);
      dest[0] = src[0];  /* (1,1) entry. */
      dest[1] = src[5];  /* (2,2) entry. */
      dest[2] = src[2];  /* (3,1) entry. */
      dest[3] = src[7];  /* (4,2) entry. */
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "Fxs");
  if (xm == NULL) {
    printf("could not find params.Fxs.\n");
  } else {
    if (!((mxGetM(xm) == 4) && (mxGetN(xm) == 8))) {
      printf("Fxs must be size (4,8), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter Fxs must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter Fxs must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter Fxs must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.Fxs;
      src = mxGetPr(xm);
      dest[0] = src[0];  /* (1,1) entry. */
      dest[1] = src[5];  /* (2,2) entry. */
      dest[2] = src[10];  /* (3,3) entry. */
      dest[3] = src[15];  /* (4,4) entry. */
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "Q");
  if (xm == NULL) {
    printf("could not find params.Q.\n");
  } else {
    if (!((mxGetM(xm) == 8) && (mxGetN(xm) == 8))) {
      printf("Q must be size (8,8), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter Q must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter Q must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter Q must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.Q;
      src = mxGetPr(xm);
      for (i = 0; i < 64; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "Q_final");
  if (xm == NULL) {
    printf("could not find params.Q_final.\n");
  } else {
    if (!((mxGetM(xm) == 8) && (mxGetN(xm) == 8))) {
      printf("Q_final must be size (8,8), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter Q_final must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter Q_final must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter Q_final must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.Q_final;
      src = mxGetPr(xm);
      for (i = 0; i < 64; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "R");
  if (xm == NULL) {
    printf("could not find params.R.\n");
  } else {
    if (!((mxGetM(xm) == 2) && (mxGetN(xm) == 2))) {
      printf("R must be size (2,2), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter R must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter R must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter R must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.R;
      src = mxGetPr(xm);
      for (i = 0; i < 4; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "d");
  if (xm == NULL) {
    printf("could not find params.d.\n");
  } else {
    if (!((mxGetM(xm) == 8) && (mxGetN(xm) == 1))) {
      printf("d must be size (8,1), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter d must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter d must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter d must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.d;
      src = mxGetPr(xm);
      for (i = 0; i < 8; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "f");
  if (xm == NULL) {
    printf("could not find params.f.\n");
  } else {
    if (!((mxGetM(xm) == 4) && (mxGetN(xm) == 1))) {
      printf("f must be size (4,1), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter f must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter f must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter f must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.f;
      src = mxGetPr(xm);
      for (i = 0; i < 4; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "ff");
  if (xm == NULL) {
    printf("could not find params.ff.\n");
  } else {
    if (!((mxGetM(xm) == 1) && (mxGetN(xm) == 1))) {
      printf("ff must be size (1,1), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter ff must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter ff must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter ff must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.ff;
      src = mxGetPr(xm);
      for (i = 0; i < 1; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "fs");
  if (xm == NULL) {
    printf("could not find params.fs.\n");
  } else {
    if (!((mxGetM(xm) == 4) && (mxGetN(xm) == 1))) {
      printf("fs must be size (4,1), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter fs must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter fs must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter fs must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.fs;
      src = mxGetPr(xm);
      for (i = 0; i < 4; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "x_0");
  if (xm == NULL) {
    printf("could not find params.x_0.\n");
  } else {
    if (!((mxGetM(xm) == 8) && (mxGetN(xm) == 1))) {
      printf("x_0 must be size (8,1), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter x_0 must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter x_0 must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter x_0 must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.x_0;
      src = mxGetPr(xm);
      for (i = 0; i < 8; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  this_var_errors = 0;
  xm = mxGetField(prhs[0], 0, "xt");
  if (xm == NULL) {
    printf("could not find params.xt.\n");
  } else {
    if (!((mxGetM(xm) == 8) && (mxGetN(xm) == 1))) {
      printf("xt must be size (8,1), not (%d,%d).\n", mxGetM(xm), mxGetN(xm));
      this_var_errors++;
    }
    if (mxIsComplex(xm)) {
      printf("parameter xt must be real.\n");
      this_var_errors++;
    }
    if (!mxIsClass(xm, "double")) {
      printf("parameter xt must be a full matrix of doubles.\n");
      this_var_errors++;
    }
    if (mxIsSparse(xm)) {
      printf("parameter xt must be a full matrix.\n");
      this_var_errors++;
    }
    if (this_var_errors == 0) {
      dest = params.xt;
      src = mxGetPr(xm);
      for (i = 0; i < 8; i++)
        *dest++ = *src++;
      valid_vars++;
    }
  }
  if (valid_vars != 14) {
    printf("Error: %d parameters are invalid.\n", 14 - valid_vars);
    mexErrMsgTxt("invalid parameters found.");
  }
  if (prepare_for_c) {
    printf("settings.prepare_for_c == 1. thus, outputting for C.\n");
    for (i = 0; i < 8; i++)
      printf("  params.x_0[%d] = %.6g;\n", i, params.x_0[i]);
    for (i = 0; i < 8; i++)
      printf("  params.xt[%d] = %.6g;\n", i, params.xt[i]);
    for (i = 0; i < 64; i++)
      printf("  params.Q[%d] = %.6g;\n", i, params.Q[i]);
    for (i = 0; i < 4; i++)
      printf("  params.R[%d] = %.6g;\n", i, params.R[i]);
    for (i = 0; i < 4; i++)
      printf("  params.Fxs[%d] = %.6g;\n", i, params.Fxs[i]);
    for (i = 0; i < 4; i++)
      printf("  params.fs[%d] = %.6g;\n", i, params.fs[i]);
    for (i = 0; i < 64; i++)
      printf("  params.Q_final[%d] = %.6g;\n", i, params.Q_final[i]);
    for (i = 0; i < 64; i++)
      printf("  params.A[%d] = %.6g;\n", i, params.A[i]);
    for (i = 0; i < 16; i++)
      printf("  params.B[%d] = %.6g;\n", i, params.B[i]);
    for (i = 0; i < 8; i++)
      printf("  params.d[%d] = %.6g;\n", i, params.d[i]);
    for (i = 0; i < 4; i++)
      printf("  params.Fu[%d] = %.6g;\n", i, params.Fu[i]);
    for (i = 0; i < 4; i++)
      printf("  params.f[%d] = %.6g;\n", i, params.f[i]);
    for (i = 0; i < 8; i++)
      printf("  params.Ff[%d] = %.6g;\n", i, params.Ff[i]);
    for (i = 0; i < 1; i++)
      printf("  params.ff[%d] = %.6g;\n", i, params.ff[i]);
  }
  /* Perform the actual solve in here. */
  steps = solve();
  /* For profiling purposes, allow extra silent solves if desired. */
  settings.verbose = 0;
  for (i = 0; i < extra_solves; i++)
    solve();
  /* Update the status variables. */
  plhs[1] = mxCreateStructArray(1, dims1x1of1, 4, status_names);
  xm = mxCreateDoubleMatrix(1, 1, mxREAL);
  mxSetField(plhs[1], 0, "optval", xm);
  *mxGetPr(xm) = work.optval;
  xm = mxCreateDoubleMatrix(1, 1, mxREAL);
  mxSetField(plhs[1], 0, "gap", xm);
  *mxGetPr(xm) = work.gap;
  xm = mxCreateDoubleMatrix(1, 1, mxREAL);
  mxSetField(plhs[1], 0, "steps", xm);
  *mxGetPr(xm) = steps;
  xm = mxCreateDoubleMatrix(1, 1, mxREAL);
  mxSetField(plhs[1], 0, "converged", xm);
  *mxGetPr(xm) = work.converged;
  /* Extract variable values. */
  plhs[0] = mxCreateStructArray(1, dims1x1of1, num_var_names, var_names);
  /* Create cell arrays for indexed variables. */
  dims[0] = 20;
  cell = mxCreateCellArray(1, dims);
  mxSetField(plhs[0], 0, "u", cell);
  dims[0] = 21;
  cell = mxCreateCellArray(1, dims);
  mxSetField(plhs[0], 0, "x", cell);
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_0", xm);
  dest = mxGetPr(xm);
  src = vars.u_0;
  for (i = 0; i < 2; i++) {
    *dest++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_1", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 0, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_1;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_2", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 1, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_2;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_3", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 2, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_3;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_4", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 3, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_4;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_5", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 4, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_5;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_6", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 5, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_6;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_7", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 6, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_7;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_8", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 7, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_8;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_9", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 8, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_9;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_10", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 9, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_10;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_11", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 10, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_11;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_12", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 11, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_12;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_13", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 12, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_13;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_14", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 13, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_14;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_15", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 14, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_15;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_16", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 15, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_16;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_17", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 16, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_17;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_18", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 17, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_18;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_19", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 18, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_19;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(2, 1, mxREAL);
  mxSetField(plhs[0], 0, "u_20", xm);
  xm_cell = mxCreateDoubleMatrix(2, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "u");
  mxSetCell(cell, 19, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.u_20;
  for (i = 0; i < 2; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_1", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 0, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_1;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_2", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 1, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_2;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_3", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 2, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_3;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_4", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 3, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_4;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_5", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 4, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_5;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_6", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 5, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_6;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_7", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 6, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_7;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_8", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 7, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_8;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_9", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 8, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_9;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_10", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 9, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_10;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_11", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 10, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_11;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_12", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 11, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_12;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_13", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 12, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_13;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_14", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 13, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_14;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_15", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 14, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_15;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_16", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 15, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_16;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_17", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 16, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_17;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_18", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 17, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_18;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_19", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 18, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_19;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_20", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 19, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_20;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
  xm = mxCreateDoubleMatrix(8, 1, mxREAL);
  mxSetField(plhs[0], 0, "x_21", xm);
  xm_cell = mxCreateDoubleMatrix(8, 1, mxREAL);
  cell = mxGetField(plhs[0], 0, "x");
  mxSetCell(cell, 20, xm_cell);
  dest = mxGetPr(xm);
  dest_cell = mxGetPr(xm_cell);
  src = vars.x_21;
  for (i = 0; i < 8; i++) {
    *dest++ = *src;
    *dest_cell++ = *src++;
  }
}
Exemple #23
0
/* MEX interface function */
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
    FreemanPyramidCntrlStruct *cntrl = NULL;
    FreemanPyramidStruct *fp = NULL;
    FreemanCacheCntrlStruct *fpcc = NULL;
    float *image, *tmp;
    float epsAmp = 0.0;
    float epsC = 0.0;
    int nxImage, nyImage;
    int iChannel, iScale, iOrient;
    int iCell, iOut, iBasis;
    int k, n;
    mwSize dims[3];
    mxArray *mxTmp;

    /* check for the required input arguments */
    if( nrhs < 2 || nrhs > 3 )
        mexErrMsgTxt( "Input expected: CNTRL, IMAGE, CACHECNTRL" );

    /* decode the matlab version of the pyramid control structure
       and allocate the pyramid structure */
    mexFreemanPyramidCntrlStruct( prhs[0], &cntrl, &epsAmp, &epsC );
    fp = newFreemanPyramidStruct( cntrl );
    if( nrhs == 3 )
        mexFreemanCacheCntrlStruct( prhs[2], &fpcc );

    /* get the image to be filtered */
    mex2float( prhs[1], &image, &nxImage, &nyImage );

    /* build the pyramid */
    if( fpcc == NULL ) {
        computeFreemanPyramid_Float(fp, image, nxImage, nyImage,
                                    epsAmp, epsC);
    } else {
        recoverFreemanPyramid_Float(fp, image, nxImage, nyImage,
                                    epsAmp, epsC, fpcc );
    }

    /* return the results to matlab in the order
       they appear in cntrl->storeMap */
    iOut = 0;
    /* return the gradient maps if necessary */
    if( cntrl->storeMap[isGrad] ) {
        if( iOut >= nlhs )
            mexErrMsgTxt( "Too few output arguments" );

        dims[0] = cntrl->nScale;
        dims[1] = cntrl->nOrient;
        dims[2] = 2;
        plhs[iOut] = mxCreateCellArray( 3, dims );

        for( iScale = 0; iScale < cntrl->nScale; iScale++ ) {
            for( iOrient = 0; iOrient < cntrl->nOrient; iOrient++ ) {
                iChannel = 2*(cntrl->nOrient*iScale + iOrient);
                dims[0] = iScale;
                dims[1] = iOrient;
                float2mex( fp->gradMap[iChannel], &mxTmp,
                           fp->nxFilt[iScale],
                           fp->nyFilt[iScale] );
                dims[2] = 0;
                iCell = mxCalcSingleSubscript( plhs[iOut], 3, dims );
                mxSetCell( plhs[iOut], iCell, mxTmp );
                float2mex( fp->gradMap[iChannel+1], &mxTmp,
                           fp->nxFilt[iScale],
                           fp->nyFilt[iScale] );
                dims[2] = 1;
                iCell = mxCalcSingleSubscript( plhs[0], 3, dims );
                mxSetCell( plhs[iOut], iCell, mxTmp );
            }
        }

        iOut++;
    }

    /* return the phase maps if necessary */
    if( cntrl->storeMap[isPhase] ) {
        if( iOut >= nlhs )
            mexErrMsgTxt( "Too few output arguments" );

        dims[0] = cntrl->nScale;
        dims[1] = cntrl->nOrient;
        plhs[iOut] = mxCreateCellArray( 2, dims );

        for( iScale = 0; iScale < cntrl->nScale; iScale++ ) {
            for( iOrient = 0; iOrient < cntrl->nOrient; iOrient++ ) {
                iChannel = cntrl->nOrient*iScale + iOrient;
                dims[0] = iScale;
                dims[1] = iOrient;
                float2mex( fp->phaseMap[iChannel], &mxTmp,
                           fp->nxFilt[iScale],
                           fp->nyFilt[iScale] );
                iCell = mxCalcSingleSubscript( plhs[iOut], 2, dims );
                mxSetCell( plhs[iOut], iCell, mxTmp );
            }
        }

        iOut++;
    }

    /* return the amplitude maps if necessary */
    if( cntrl->storeMap[isAmp] ) {
        if( iOut >= nlhs )
            mexErrMsgTxt( "Too few output arguments" );

        dims[0] = cntrl->nScale;
        dims[1] = cntrl->nOrient;
        plhs[iOut] = mxCreateCellArray( 2, dims );

        for( iScale = 0; iScale < cntrl->nScale; iScale++ ) {
            for( iOrient = 0; iOrient < cntrl->nOrient; iOrient++ ) {
                iChannel = cntrl->nOrient*iScale + iOrient;
                dims[0] = iScale;
                dims[1] = iOrient;
                float2mex( fp->ampMap[iChannel], &mxTmp,
                           fp->nxFilt[iScale],
                           fp->nyFilt[iScale] );
                iCell = mxCalcSingleSubscript( plhs[iOut], 2, dims );
                mxSetCell( plhs[iOut], iCell, mxTmp );
            }
        }

        iOut++;
    }

    /* return the filter maps if necessary */
    if( cntrl->storeMap[isFilter] ) {
        if( iOut >= nlhs )
            mexErrMsgTxt( "Too few output arguments" );

        dims[0] = cntrl->nScale;
        dims[1] = cntrl->nOrient;
        dims[2] = 2;

        plhs[iOut] = mxCreateCellArray( 3, dims );

        for( iScale = 0; iScale < cntrl->nScale; iScale++ ) {
            for( iOrient = 0; iOrient < cntrl->nOrient; iOrient++ ) {

                iChannel = 2*(cntrl->nOrient*iScale + iOrient);
                dims[0] = iScale;
                dims[1] = iOrient;
                float2mex( fp->filterMap[iChannel], &mxTmp,
                           fp->nxFilt[iScale],
                           fp->nyFilt[iScale] );
                dims[2] = 0;
                iCell = mxCalcSingleSubscript( plhs[iOut], 3, dims );
                mxSetCell( plhs[iOut], iCell, mxTmp );
                float2mex( fp->filterMap[iChannel+1], &mxTmp,
                           fp->nxFilt[iScale],
                           fp->nyFilt[iScale] );
                dims[2] = 1;
                iCell = mxCalcSingleSubscript( plhs[0], 3, dims );
                mxSetCell( plhs[iOut], iCell, mxTmp );
            }
        }

        iOut++;
    }

    /* return the basis maps if necessary */
    if( cntrl->storeMap[isBasis] ) {
        if( iOut >= nlhs )
            mexErrMsgTxt( "Too few output arguments" );

        dims[0] = cntrl->nScale;
        dims[1] = NUMBASIS;
        plhs[iOut] = mxCreateCellArray( 2, dims );

        for( iScale = 0; iScale < cntrl->nScale; iScale++ ) {
            for( iBasis = 0; iBasis < NUMBASIS; iBasis++ ) {
                iChannel = NUMBASIS*iScale + iBasis;
                dims[0] = iScale;
                dims[1] = iBasis;
                float2mex( fp->basisMap[iChannel], &mxTmp,
                           fp->nxFilt[iScale],
                           fp->nyFilt[iScale] );
                iCell = mxCalcSingleSubscript( plhs[iOut], 2, dims );
                mxSetCell( plhs[iOut], iCell, mxTmp );
            }
        }

        iOut++;
    }

    /* return the pyramid maps if necessary */
    if( cntrl->storeMap[isPyr] ) {
        if( iOut >= nlhs )
            mexErrMsgTxt( "Too few output arguments" );

        dims[0] = cntrl->nPyr;
        plhs[iOut] = mxCreateCellArray( 1, dims );

        for( iScale = 0; iScale < cntrl->nPyr; iScale++ ) {
            dims[0] = iScale;
            float2mex( fp->pyrMap[iScale], &mxTmp,
                       fp->nxPyr[iScale],
                       fp->nyPyr[iScale] );
            iCell = mxCalcSingleSubscript( plhs[iOut], 1, dims );
            mxSetCell( plhs[iOut], iCell, mxTmp );
        }

        iOut++;
    }

    /* free the pyramid, etc. */
    freeFreemanPyramid( fp );

    utilFree( (void **)&fp );
    utilFree( (void **)&cntrl );
    utilFree( (void **)&fpcc );

    return;
}
Exemple #24
0
// To run SAXParser in MATLAB: 
// [v, ds, ws, es, ews, des, ss, ess, ns, ens] = SAXParser('')
void MATProcedure(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {


    // pass the inverted index back to matlab
    // here we have to individually pass all the data from the maps into mxArrays
    
    // create the vocab array
    //int vocab_size = InvertedIndex::instance()->getVocabSize();
    
    map<string, int>* vocab = &(InvertedIndex::instance()->vocab);
    int vocab_size = InvertedIndex::instance()->vocab.size();

    //int i = 0;
    mwSize vsize = static_cast<mwSize>(vocab_size);
    plhs[0] = mxCreateCellArray(1, &vsize);
    for(map<string, int>::iterator it = vocab->begin(); it != vocab->end(); it++) {
      mxSetCell(plhs[0], (*it).second - 1, mxCreateString((*it).first.c_str()));
    }
    
    // create WS and DS arrays
    // WS, DS is size 1 x n where n is the number of word tokens. 
    // The word stream WS contains word indices in order of occurence with WS=0 
    // representing the end-of-sentence-end marker. 
    // The document indices DS contains all document indices and max(DS) = D = number of documents
    // they should be double-precision vectors
    
    int numwords = InvertedIndex::instance()->docs.size();
    plhs[1] = mxCreateDoubleMatrix(numwords, 1, mxREAL);
    plhs[2] = mxCreateDoubleMatrix(numwords, 1, mxREAL); 
    double *Z = mxGetPr(plhs[1]);
    double *D = mxGetPr(plhs[2]);
    
    for(multimap<int, int>::const_iterator it = InvertedIndex::instance()->docs.begin();
	it != InvertedIndex::instance()->docs.end();
	it++) {
      //cout << (*it).first << " " << (*it).second << "\n";
      *(Z++) = (*it).first;
      *(D++) = (*it).second;
    } 
    
    // Create sparse arrays for entities
    int rows, cols, nzmax;
    rows = InvertedIndex::instance()->entities.highest(); // highest index in entities;
    cols = vocab_size;
    nzmax = InvertedIndex::instance()->entities.size();
    
    multimap<int, int> rev = InvertedIndex::instance()->entities.reverseMap();
    
    plhs[3] = createMATSparseMatrix(rows, cols, nzmax, rev.begin(), rev.end());
    
    
  // create an array for entity_weights
    mwSize dims[2];
    dims[1] = 1;
    dims[0] = InvertedIndex::instance()->entities.highest();
    plhs[4] = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);
    int *W = (int*)mxGetData(plhs[4]);
    for(multimap<int,int>::const_iterator it = InvertedIndex::instance()->entity_weights.begin(); 
	it != InvertedIndex::instance()->entity_weights.end();
	it++) {
      W[(*it).first-1] = (*it).second;
    //cout << (*it).second << " " << W[(*it).first] << "\n";
    }
    
    
    // create a sparse matrix for doc_entities
    rows = InvertedIndex::instance()->docs.highest();
    cols = InvertedIndex::instance()->entities.highest();
    nzmax = InvertedIndex::instance()->doc_entities.size();
    rev = InvertedIndex::instance()->doc_entities.reverseMap();
    plhs[5] = createMATSparseMatrix(rows, cols, nzmax, rev.begin(), rev.end());
    
    // crate a sparse matrix for syns
    rows = InvertedIndex::instance()->syns.highest();
    cols = vocab_size;
    nzmax = InvertedIndex::instance()->syns.size();
    rev = InvertedIndex::instance()->syns.reverseMap();
    plhs[6] = createMATSparseMatrix(rows, cols, nzmax, rev.begin(), rev.end());
    
    // create a sparse matrix for entity_syn 
    rows = InvertedIndex::instance()->entities.highest();
    cols = InvertedIndex::instance()->syns.highest();
    nzmax = InvertedIndex::instance()->entity_syns.size();
    rev = InvertedIndex::instance()->entity_syns.reverseMap();
    plhs[7] = createMATSparseMatrix(rows, cols, nzmax, rev.begin(), rev.end());

    // crate a sparse matrix for names
    rows = InvertedIndex::instance()->names.highest();
    cols = vocab_size;
    nzmax = InvertedIndex::instance()->names.size();
    rev = InvertedIndex::instance()->names.reverseMap();
    plhs[8] = createMATSparseMatrix(rows, cols, nzmax, rev.begin(), rev.end());
    
    // create a sparse matrix for entity_names
    rows = InvertedIndex::instance()->entities.highest();
    cols = InvertedIndex::instance()->names.highest();
    nzmax = InvertedIndex::instance()->entity_names.size();
    rev = InvertedIndex::instance()->entity_names.reverseMap();
    plhs[9] = createMATSparseMatrix(rows, cols, nzmax, rev.begin(), rev.end());
    
}
Exemple #25
0
void mexFunction( int nlhs, mxArray *plhs[3], int nrhs, const mxArray *prhs[4] ) {
	//int i, j;
    int Ver_r, Ver_c;
	int Tri_r, Tri_c;
    int NoV, NoF;
    double *temp1, *temp2;
    double *Ver, *Tri;
    //double *output;
    int MNL;			// MAX NEIGHBOR LAVEL
	int ShowRunTime;	// flag controls showing or not
	const char **fnames;       /* pointers to field names */
	mxArray *Mk1, *Mk2, *Mt1, *Mt2, *MVc;	// matrix
	mxArray *Ridges, *Valleys;				// cell
	double *Pk1, *Pk2, *Pt1, *Pt2, *PVc;
	mwSize ndim = 2;
	mwSize *dims;
	long int Tic;
	double Toc;

	Tic = Current_Clock();

	dims = new mwSize[ndim];
	dims[0] = 3;
	dims[1] = 1;

	Polyhedron *mymesh = new Polyhedron();

/*
    if (nrhs != nlhs)
    mexErrMsgTxt("The number of input and output arguments must be the same.");
*/
	if ( nrhs != 4 ) {
		delete mymesh;
		mexErrMsgTxt( "The number of inputs must be 4: Ver & Tri arrays, MNL & ShowRunTime integers." );
	}

    /* Find the dimensions of the data */
    Ver_r = (int)mxGetM( prhs[0] ); /* # of rows in Ver */
    Ver_c = (int)mxGetN( prhs[0] ); /* # of columns in Ver */
    if ( Ver_c != 3 )
		mexErrMsgTxt("Ver should be Nx3!");
	NoV = Ver_r;

    Tri_r = (int)mxGetM( prhs[1] ); /* # of rows in Tri */
    Tri_c = (int)mxGetN( prhs[1] ); /* # of columns in Tri */
    if ( Tri_c != 3 )
		mexErrMsgTxt("Tri should be Nx3!");
	NoF = Tri_r;

    Ver   = mxGetPr( prhs[0] );
    Tri   = mxGetPr( prhs[1] );
    temp1 = mxGetPr( prhs[2] );
    temp2 = mxGetPr( prhs[3] );
	MNL   = (int)*temp1;		// MAX NEIGHBOR LAVEL
	ShowRunTime = (int)*temp2;

	if ( ShowRunTime == 1 ) {
		mexPrintf("|----------------------------------------------|\n" );
		mexPrintf("|Function RVLines begins! Please wait...\n" );
	}

    //mexPrintf( "MNL: %d\n", MNL );
    //mexPrintf( "ShowRunTime: %d\n", ShowRunTime );
	//mexPrintf( "Ver(1,1:3): %lf %lf %lf\n", Ver[0], Ver[NoV], Ver[2*NoV] );
	//mexPrintf( "Tri(1,1:3): %d %d %d\n", (int)Tri[0], (int)Tri[NoF], (int)Tri[2*NoF] );

	/* Create 5 mxArrays for the output data */
	Mk1 = mxCreateDoubleMatrix( NoV, 1, mxREAL );
	Mk2 = mxCreateDoubleMatrix( NoV, 1, mxREAL );
	Mt1 = mxCreateDoubleMatrix( NoV, 3, mxREAL );
	Mt2 = mxCreateDoubleMatrix( NoV, 3, mxREAL );
	MVc = mxCreateDoubleMatrix( NoV, 3, mxREAL );

    /* Create 5 pointers to the output data */
	Pk1 = mxGetPr( Mk1 );
	Pk2 = mxGetPr( Mk2 );
	Pt1 = mxGetPr( Mt1 );
	Pt2 = mxGetPr( Mt2 );
	PVc = mxGetPr( MVc );

	Ridges  = mxCreateCellArray( ndim, dims );
	Valleys = mxCreateCellArray( ndim, dims );

	// ======================================================================================
	mymesh -> loadMesh( Ver, Tri, NoV, NoF, MNL, ShowRunTime );
	mymesh -> setProperty( Ridges, Valleys, ShowRunTime );
	mymesh -> putRmesh( Pk1, Pk2, Pt1, Pt2, PVc );
	// ======================================================================================
	
	//mexPrintf("%lf %lf %lf %lf %lf\n",output[0],output[NoV],output[2*NoV],output[3*NoV],output[4*NoV]);

	/* set field names */
    fnames = new const char*[7];
	fnames[0] = "PrinCur_k1";	// principal curvature k1 at each vector
	fnames[1] = "PrinCur_k2";	// principal curvature k2 at each vector
	fnames[2] = "PrinDir_t1";	// principal direction t1 at each vector
	fnames[3] = "PrinDir_t2";	// principal direction t2 at each vector
	fnames[4] = "VectorNorm";	// vector normal at each vector
	fnames[5] = "Valleys";
	fnames[6] = "Ridges";

    /* create a 1x1 struct matrix for output  */
    plhs[0] = mxCreateStructMatrix( 1, 1, 7, fnames );

	/* set each field in output structure */
	mxSetFieldByNumber( plhs[0], 0, 0, Mk1 );
	mxSetFieldByNumber( plhs[0], 0, 1, Mk2 );
	mxSetFieldByNumber( plhs[0], 0, 2, Mt1 );
	mxSetFieldByNumber( plhs[0], 0, 3, Mt2 );
	mxSetFieldByNumber( plhs[0], 0, 4, MVc );
	mxSetFieldByNumber( plhs[0], 0, 5, Valleys );
	mxSetFieldByNumber( plhs[0], 0, 6, Ridges );

	Toc = (double)(Current_Clock() - Tic) / MY_TIMER_CONST;

	if ( ShowRunTime == 1 ) {
		mexPrintf("|    Total runtime:      %.4f second.\n", Toc );
		mexPrintf("|Function RVLines done! Congratulations!\n" );
		mexPrintf("|----------------------------------------------|\n" );
	}

	delete [] dims;
	delete [] fnames;
	delete mymesh;
	return;
}
void mexFunction (
                  int nlhs,       mxArray *plhs[],
                  int nrhs,  const mxArray *prhs[]
                  )
{
	
	int col, row, r_find , movie_length, traces_col, min_length, trace_length, r_integrate, fnumber_size, trace_number;
	double *movie, h_min, *p2Matrix, *cur_trace, *fnumber, *pos;
	std::vector< std::vector< std::vector<int> > > itraces;
	std::vector< std::vector< int > > positions;
	
	std::vector<int> framenumber;
	/* Check for proper number of arguments */
	if (nrhs != 5 ) {
		mexErrMsgTxt ("append_traces_to_positions requires: movie, itraces, framenumbers, positions, r_integrate");
	} else if (nlhs != 1 ) {
		mexErrMsgTxt ("append_traces_to_positions returns list of itraces ");
	}
	
	
	/* Get arguments from MATLAB */
	//
	movie = mxGetPr(prhs[0]);  //columns * rows * frame
	movie_length = (int) mxGetDimensions(prhs[0])[2]; //length of video = number of frames
	col = (int) mxGetDimensions(prhs[0])[0]; //number of columns
	row = (int) mxGetDimensions(prhs[0])[1]; //number of rows
	
	r_integrate = (int)(mxGetScalar(prhs[4]));
	
	
	

	
	//fill framenumbers
	fnumber = mxGetPr(prhs[2]);  //columns * rows * frame
	for(int i=0; i< PeakProcessing::max(mxGetM(prhs[2]), mxGetN(prhs[2]) ); i++){
		framenumber.push_back( (int)fnumber[i] );
	}
	

	
	trace_number = mxGetM(prhs[1]);
	//fill itraces
	for(int i=0; i<trace_number; i++){
        cur_trace = mxGetPr(mxGetCell(prhs[1],i));
		trace_length = mxGetM(mxGetCell(prhs[1],i));
		std::vector< std::vector<int> > tmptrace;
		//loop through ith trace
		for(int j=0; j<trace_length; j++){
			std::vector<int> addthis;
			addthis.push_back(cur_trace[trace_length*0+j]); //framenumber
			addthis.push_back(cur_trace[trace_length*1+j]); //x
			addthis.push_back(cur_trace[trace_length*2+j]); //y
			addthis.push_back(cur_trace[trace_length*3+j]); //intensity
			tmptrace.push_back(addthis);
		} 
		itraces.push_back(tmptrace);
	}
	
	
	//load positions
	pos= mxGetPr(prhs[3]);  //columns * rows * frame
	int pos_col = mxGetM(prhs[3]);
	for(int i=0; i< pos_col; i++){
		std::vector< int > tmp;
		for (int j=0; j < mxGetN(prhs[3]) ; j++) {
			tmp.push_back( (int)pos[j*pos_col + i]);
		}
		
		positions.push_back(tmp);
	}
	
	
	PeakProcessing::append_traces_to_position(movie, movie_length, col, row,  &itraces, &positions, r_integrate, &framenumber);
	
	
	
	//delete short traces
	/*int trace_number=0;
	 for(int i=0; i< traces.size(); i++){
	 if(traces[i].size() < min_length){
	 traces.erase(traces.begin()+i);
	 i--;
	 }
	 } */
	
    mexPrintf("movie_length = %i \tImage = %i , %i\tr_integrate = %i\t%i itraces\n", movie_length, col, row, r_integrate, itraces.size());

	
	//Allocate storage place for the result 
	int dims[1];  dims[0]=(int) itraces.size();  //number of traces   
	plhs[0] = mxCreateCellArray(1, dims  );
	
	
	for(int i=0; i< itraces.size(); i++){
		traces_col = itraces[i].size();
		mxArray * tmp = mxCreateDoubleMatrix((int)itraces[i].size(),4, mxREAL); //make mxArray to store the ith trace
		p2Matrix = mxGetPr(tmp);
		//fill this array
		for(int j=0; j<itraces[i].size(); j++){
			p2Matrix[traces_col*0+j] = itraces[i][j][0]; //framenumber
			p2Matrix[traces_col*1+j] = itraces[i][j][1]; //x
			p2Matrix[traces_col*2+j] = itraces[i][j][2]; //y 
			p2Matrix[traces_col*3+j] = itraces[i][j][3]; //intensity 

			//mexPrintf("%i\t %i \t %i\n", traces[i][j][0], traces[i][j][1], traces[i][j][2]);
		}
		mxSetCell(plhs[0], i,tmp);
		
	}
	
	
	
	
	
	
	
}
Exemple #27
0
void
mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    MatlabCPPInitialize(false);

    // Check for proper number of arguments
    if ( (nrhs < NR_IN) || (nrhs > NR_IN + NR_IN_OPT) || \
            (nlhs < NR_OUT) || (nlhs > NR_OUT + NR_OUT_OPT) ) {
        mexErrMsgTxt("Wrong number of arguments.");
    }

    // fetch the input (we support matrices and cell arrays)
    std::vector< Eigen::VectorXd > theta_unary;
    std::vector< Eigen::VectorXd > theta_pair;

    if (!mxIsCell(THETA_UNARY_IN)) {
        GetMatlabPotentialFromMatrix(THETA_UNARY_IN, theta_unary);
        GetMatlabPotentialFromMatrix(THETA_PAIR_IN, theta_pair);
    }
    else {
        GetMatlabPotential(THETA_UNARY_IN, theta_unary);
        GetMatlabPotential(THETA_PAIR_IN, theta_pair);
    }
    
    Eigen::MatrixXi edges;
    GetMatlabMatrix(EDGES_IN, edges);

    double beta = mxGetScalar(BETA_IN);
    
    TreeInference inf = TreeInference(theta_unary, theta_pair, edges);
    inf.run(beta);
            
    LOGZ_OUT = mxCreateNumericMatrix(1, 1, mxDOUBLE_CLASS, mxREAL);
    double* logz_p = mxGetPr(LOGZ_OUT);
    logz_p[0] = inf.getLogPartitionSum();
    
    // return marginals (if input was provided as a matrix, also return
    // marginals in a matrix)
    if (nlhs > 1) {
        std::vector< Eigen::VectorXd >& mu_unary = inf.getUnaryMarginals();
        if (!mxIsCell(THETA_UNARY_IN)) {
            size_t num_states = mxGetM(THETA_UNARY_IN);
            size_t num_vars = mxGetN(THETA_UNARY_IN);
            MARGINALS_UNARY_OUT = mxCreateNumericMatrix(
                                    num_states, 
                                    num_vars,
                                    mxDOUBLE_CLASS, mxREAL);
            double* mu_res_p = mxGetPr(MARGINALS_UNARY_OUT);
            for (size_t v_idx=0; v_idx<mu_unary.size(); v_idx++) {
                for (size_t idx=0; idx<mu_unary[v_idx].size(); idx++) {
                    mu_res_p[v_idx*num_states+idx] = mu_unary[v_idx](idx);
                }
            }
        }
        else {
            mwSize dim_0 = static_cast<mwSize>(mu_unary.size());
            MARGINALS_UNARY_OUT = mxCreateCellArray(1, &dim_0);
            for (size_t v_idx=0; v_idx<mu_unary.size(); v_idx++) {
                mxArray* m = mxCreateNumericMatrix(
                                static_cast<int>(mu_unary[v_idx].size()),
                                1,
                                mxDOUBLE_CLASS, mxREAL);
                double* mu_res_p = mxGetPr(m);
                for (size_t idx=0; idx<mu_unary[v_idx].size(); idx++) {
                    mu_res_p[idx] = mu_unary[v_idx](idx);
                }

                mxSetCell(MARGINALS_UNARY_OUT, v_idx, m);
            }
        }
    }

    // return pairwise marginals
    if (nlhs > 2) {
        std::vector< Eigen::VectorXd >& mu_pair = inf.getPairwiseMarginals();
        if (!mxIsCell(THETA_UNARY_IN)) {
            size_t num_states = mxGetM(THETA_PAIR_IN);
            size_t num_edges = mxGetN(THETA_PAIR_IN);
            MARGINALS_PAIR_OUT = mxCreateNumericMatrix(
                                    num_states, 
                                    num_edges,
                                    mxDOUBLE_CLASS, mxREAL);
            double* mu_res_p = mxGetPr(MARGINALS_PAIR_OUT);
            for (size_t e_idx=0; e_idx<mu_pair.size(); e_idx++) {
                for (size_t idx=0; idx<mu_pair[e_idx].size(); idx++) {
                    mu_res_p[e_idx*num_states+idx] = mu_pair[e_idx](idx);
                }
            }
        }
        else {
            mxAssert(0, "not implemented yet!");
            // TODO: not implemented yet, see above!
            // see unary case above!
        }
    }

    MatlabCPPExit();
}
Exemple #28
0
void mexFunction( int nlhs, mxArray *plhs[], 
				 int nrhs, const mxArray *prhs[] ) 
{

    static char buff[80+1];
    buff[0]=0;
 	mxGetString(prhs[0],buff,80);

 
	if (strcmp(buff,"Init") == 0) {

		//DWORD threadId;
		if (threadId > 0) {
			mexPrintf("Init called twice before a Release was called. Trying to release first......\n");
			PostThreadMessage(threadId, WM_QUIT, 0, 0);
			Sleep(1000);
		}

		CloseHandle(CreateThread(NULL, 0, Thread, NULL, 0, &threadId));
		
		//const unsigned int dim_array[2] = {1,1};
		//plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim_array, mxDOUBLE_CLASS, mxREAL);

		for (int k=0;k< iMAXMICE;k++) 
			HookMiceArray[k] = false;

		//double *buffer = (double*)mxGetPr(plhs[0]);
		//*buffer = threadId;
		return;
	}
	if (strcmp(buff,"Hook") == 0) {
			int iNumHooks = mxGetNumberOfElements(prhs[1]);
			double *aiHookArray = mxGetPr(prhs[1]);
			for (int k=0; k < iNumHooks ;k++)
				HookMiceArray[int(aiHookArray[k])] = true;
	}
	if (strcmp(buff,"Unhook") == 0) {
			int iNumHooks = mxGetNumberOfElements(prhs[1]);
			double *aiHookArray = mxGetPr(prhs[1]);
			for (int k=0; k < iNumHooks ;k++)
				HookMiceArray[int(aiHookArray[k])] = false;
	}


	if (strcmp(buff,"Release") == 0) {
		//DWORD threadId =  (DWORD) (*(double*)mxGetPr(prhs[1]));
		if (threadId > 0) {
			PostThreadMessage(threadId, WM_QUIT, 0, 0);
			threadId = 0;
		} else {
			mexPrintf("Nothing To Release. Init was not called...\n");
		}
		return;
	}
	
	if (strcmp(buff,"GetMiceName") == 0) {
		int NumMice = raw_mouse_count();
		mwSize Dim[2] = {1,NumMice };
		mxArray *mxNames = mxCreateCellArray(2,Dim);
		for (int k=0;k<NumMice;k++) {
			char name[5000];
			int nSize = get_raw_mouse_name(k, name);
			mxSetCell(mxNames,k, mxCreateString(name));
		}
		plhs[0] = mxNames;
	}
	

	if (strcmp(buff,"GetNumMice") == 0) {
		
		const unsigned int dim_array[2] = {1,1};
		plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim_array, mxDOUBLE_CLASS, mxREAL);
		double *buffer = (double*)mxGetPr(plhs[0]);

		if (threadId == 0) {
			mexPrintf("Call The Init Function First!\n");
			*buffer =  -1;
		} else {
			*buffer =  raw_mouse_count();
		}

		return;
	}
	
	
	if (strcmp(buff,"GetMouseData") == 0) {
		int MouseIndex=  int(*(double*)mxGetPr(prhs[1]));
	
		const unsigned int dim_array[2] = {1,3};
		plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim_array, mxDOUBLE_CLASS, mxREAL);
		double *buffer = (double*)mxGetPr(plhs[0]);
		if (threadId == 0) { 
			mexPrintf("Call The Init Function First!\n");
			buffer[0] = 0;
			buffer[1] = 0;
			buffer[2] = 0;
		} else {
			buffer[0] = get_raw_mouse_x_delta(MouseIndex);
			buffer[1] = get_raw_mouse_y_delta(MouseIndex);
			buffer[2] = get_raw_mouse_z_delta(MouseIndex);
		}
		return;
	}
	if (strcmp(buff,"GetButtons") == 0) {

		double *MouseIndex=  (double*)mxGetPr(prhs[1]);
	
		const unsigned int dim_array[2] = {1,3};
		
		plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim_array, mxDOUBLE_CLASS, mxREAL);
		double *buffer = (double*)mxGetPr(plhs[0]);
		if (threadId == 0) {
			mexPrintf("Call The Init Function First!\n");
			for (int k=0;k<3;k++) {
				buffer[k] = 0;
			}

		} else  {
			for (int k=0;k<3;k++) {
				buffer[k] = is_raw_mouse_button_pressed(int(MouseIndex[k]),k);
			}
	    }
		return;
	}
	if (strcmp(buff,"GetWheels") == 0) {
		double *MouseIndex=  (double*)mxGetPr(prhs[1]);
		if (MouseIndex == NULL) {
			mwSize dim[2] = {0,0};
			plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim, mxDOUBLE_CLASS, mxREAL);
			return;
		}

		int NumEl = mxGetNumberOfElements(prhs[1]);
		mwSize dim[2] = {1,NumEl};
		plhs[0] = mxCreateNumericArray(2,(const mwSize*)dim, mxDOUBLE_CLASS, mxREAL);
		double *buffer = (double*)mxGetPr(plhs[0]);
		if (threadId == 0) {
			mexPrintf("Call The Init Function First!\n");
			for (int k=0;k<MAX(dim[0],dim[1]);k++) {
				buffer[k] = 0;
			}

		} else  {
			for (int k=0;k<NumEl;k++) {
				ULONG Z = get_raw_mouse_z_delta(int(MouseIndex[k]));
				buffer[k] = double((Z > 4294967295/2) ? double(Z)-4294967295 : Z);
			}
	    }
		return;
	}


}
Exemple #29
0
int bipartition(int *set, int setSize, int nMax, int option, mxArray *B1, mxArray *B2) {
    
    
    if(option == 1)
        nMax = floor(nMax/2);
    
    nB = 0;
    for(int i = 0; i <= nMax; i++)
        nB = nB + nchoosek(setSize,i);
    
    int cellDims[2] = (nB,1);
    B1 = mxCreateCellArray (2,cellDims);
    B2 = mxCreateCellArray (2,cellDims);
    
    int iB = 0;
    
    //open up MATLAB engine to use the nchoosek function
    // TODO: !!! CAN WE USE mexCallMATLAB INSTEAD!?
    Engine *ep;
    
    if (!(ep = engOpen("\0"))) {
		fprintf(stderr, "\nCan't start MATLAB engine\n");
		//return EXIT_FAILURE;
	}
    
    for (int i = 0; i <= nMax; i++) {
        
        B1cellPtr = mxGetCell(B1, iB);
        B2cellPtr = mxGetCell(B2, iB);
        
        if(i == 0) {
            
            B1cellPtr = NULL;
            B2cellPtr = set; //do we need memcpy here?
            iB++;
        } else {
            
            mxArray *iMATLAB = mxCreateDoubleMatrix(1, 1, mxREAL);
            memcpy((void *)mxGetPr(iMATLAB), (void *)i, sizeof(i));
            mxArray *setSizeMATLAB = mxCreateDoubleMatrix(1, 1, mxREAL);
            memcpy((void *)mxGetPr(setSizeMATLAB), (void *)setSize, sizeof(setSize));
            
            engPutVariable(ep, "i", iMATLAB);
            engPutVariable(ep, "setSize", setSizeMATLAB);
            
            engEvalString(ep, "C_b = nchoosek(1:setSize,i);");
            
            int *chooseSets;
            mxArray *C_bmxArray = engGetVariable(ep,"C_b");
            double *temp = mxGetPr(C_bmxArray);
            int chooseSetsSizeCols = mxGetN(C_bmxArray);
            int chooseSetsSizeRows = mxGetM(C_bmxArray);
            int chooseSetSize = chooseSetsSizeCols*chooseSetsSizeRows;
            int chooseSets[chooseSetSize];
            for(int j = 0; j < chooseSetSize; j++)
                chooseSets[j] = temp[j];
            
            for(int j = 0; j < C_bSizeRows; j++) {

                int chooseSetIndex = 0;
                int B1index = 0;
                int B2index = 0;
                for(int k =0; k < setSize; k++) {
                    if((j + chooseSetIndex*C_bSizeRows) < chooseSetSize) 
                            && chooseSet[j + chooseSetIndex*C_bSizeRows] == set[k]) {
                        
                        B1cellPtr[B1index] = set[k];
                        chooseSetIndex++;
                        B1index++;
                    } else {
                        B2cellPtr[B2index] = set[k];
                        B2index++;
                    }      
                    iB++;
                }
            }
            
            

            mxDestroyArray(iMATLAB);
            mxDestroyArray(setSize);
            
        }
    }
Exemple #30
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
  // variables for GBP  
  int*** assignInd = 0;
  double* bethe = 0;
  GBPPreProcessor* processor = 0;
  MRF* reg_mrf = 0;
  int* extractSingle = 0;
  int** extractPairs = 0;
  RegionLevel* regions = 0;
  vector<RegionLevel>* in_allRegions = 0;
  // variables for user
  Region** all_regions = 0;

  // **************************************************************************
  // reading input arguments
  // **************************************************************************

  if (nrhs != 8) {
    mexErrMsgTxt("Incorrect number of input arguments.");
  }

  // check number of output arguments
  if ((nlhs > 0) && (nlhs != 7)) {
    mexErrMsgTxt("Incorrect number of output arguments.");
  }

  // get number of nodes and adjMat
  vector<Nodes>* adjMat = new vector<Nodes>();
  fillAdjMat(prhs[0],*adjMat);
  int num_nodes = adjMat->size();

  // define the MRF
  MRF* mrf = new MRF(*adjMat);
  // get local potentials
  fillLocalMat(prhs[2],mrf);
  
  // get pairwise potentials
  fillPsiMat(prhs[1],mrf);
  
  // get regions
  bool allLevels = (int)(mxGetScalar(prhs[4])) > 0;
  if (allLevels) {
    in_allRegions = new vector<RegionLevel>();
    in_allRegions->clear();
    fillRegionLevels(prhs[3],*in_allRegions);
  }
  else {
    regions = new RegionLevel();
    fillRegions(prhs[3],*regions);
  }

  bool trw = (int)(mxGetScalar(prhs[5])) > 0;
  double* countingNode = 0;
  if (trw) {
    countingNode = new double[num_nodes];
    fillDouble(prhs[6], countingNode, num_nodes);
  }

  bool full = (int)(mxGetScalar(prhs[7])) > 0;


  // **************************************************************************
  // making pre-process
  // **************************************************************************

  if (allLevels) {
    processor = new GBPPreProcessor(in_allRegions, mrf, trw, full, countingNode);
  }
  else {
    processor = new GBPPreProcessor(*regions, mrf, trw, full, countingNode);
    regions->clear();
    delete regions;
    regions = 0;
  }

  all_regions = processor->getAllRegions();
  reg_mrf = processor->getRegionMRF();
  assignInd = processor->getAssignTable();
  bethe = processor->getBethe();
  extractSingle = processor->getExtractSingle();
  extractPairs = processor->getExtractPairs();

  
  // **************************************************************************
  // writing output arguments
  // **************************************************************************

  // output: 1. regions - a cell array with vectors of the nodes in each region
  //         2. regions' adj-matrix
  //         3. regions' local potentials
  //         4. assignment-indices (for each parent's assignment, the index of
  //                                the relevant son's assignment)
  //         5. bethe
  //         6. extractSingle (for each node, from which region its belief
  //                           should be extracted)
  //         7. extractPairs  (for each pair of neighbours, from which region
  //                           its pairwise beliefs should be extracted)
  
  if (nlhs > 0) {

    int num_regs = reg_mrf->N;
    int regs_dims[2] = {1,num_regs};
    
    // assign: 1. regions 2. regions' adj-matrix & 3. regions' local potentials
    plhs[0] = mxCreateCellArray(2,regs_dims);
    plhs[1] = mxCreateCellArray(2,regs_dims);
    plhs[2] = mxCreateCellArray(2,regs_dims);

    for (int i=0; i<num_regs; i++) {

      // regions
      Region* region = all_regions[i];
      int reg_i_size = (int)(region->size());
      int reg_i_dims[2] = {1,reg_i_size};
      mxArray* reg_i = mxCreateNumericArray(2,reg_i_dims,mxDOUBLE_CLASS, mxREAL);
      double* reg_i_ptr = mxGetPr(reg_i);
      for (int n=0; n<reg_i_size; n++) {
	reg_i_ptr[n] = (double)((*region)[n]);
      }
      mxSetCell(plhs[0],i,reg_i);
      
      // adj-matrix
      int adj_dims[2] = {1,reg_mrf->neighbNum(i)};
      mxArray* adj_i = mxCreateNumericArray(2,adj_dims,mxDOUBLE_CLASS, mxREAL);
      double* adj_i_ptr = mxGetPr(adj_i);
      for (int n=0; n<reg_mrf->neighbNum(i); n++) {
	adj_i_ptr[n] = (double)(reg_mrf->adjMat[i][n] + 1);
      }
      mxSetCell(plhs[1],i,adj_i);

      // local potentials
      int local_dims[2] = {reg_mrf->V[i],1};
      mxArray* local_i = mxCreateNumericArray(2, local_dims, mxDOUBLE_CLASS, mxREAL);
      double* local_i_ptr = mxGetPr(local_i);
      for (int xi=0; xi<reg_mrf->V[i]; xi++) {
	local_i_ptr[xi] = reg_mrf->localMat[i][xi];
      }
      mxSetCell(plhs[2],i,local_i);

    }

    // assign: 4. assignment indices
    int ass_dims[2] = {1,num_regs};
    plhs[3] = mxCreateCellArray(2,ass_dims);

    for (int i=0; i<num_regs; i++) {
      
      int ass_i_dims[2] = {1,reg_mrf->neighbNum(i)};
      mxArray* ass_i = mxCreateCellArray(2,ass_i_dims);
      
      for (int n=0; n<reg_mrf->neighbNum(i); n++) {
	int j = reg_mrf->adjMat[i][n];
	if (i<j) {
	  int ass_val_dims[2] = {1,reg_mrf->V[i]};
	  mxArray* ass_ij = mxCreateNumericArray(2, ass_val_dims, mxDOUBLE_CLASS, mxREAL);
	  double* ass_ij_ptr = mxGetPr(ass_ij);
	  for (int xi=0; xi<reg_mrf->V[i]; xi++) {
	    ass_ij_ptr[xi] = (double)(assignInd[i][n][xi]);
	  }
	  mxSetCell(ass_i, n, ass_ij);
	}
      }
      
      mxSetCell(plhs[3], i, ass_i);
    }

    // assign: 5. bethe
    plhs[4] = mxCreateNumericArray(2, regs_dims, mxDOUBLE_CLASS, mxREAL);
    double* bethe_ptr = mxGetPr(plhs[4]);
    for (int i=0; i<num_regs; i++) {
      bethe_ptr[i] = bethe[i];
    }

    // assign: 6. extractSingle
    int extract_dims[2] = {1,num_nodes};

    plhs[5] = mxCreateNumericArray(2, extract_dims, mxDOUBLE_CLASS, mxREAL);
    double* exSing_ptr = mxGetPr(plhs[5]);
    for (int i=0; i<num_nodes; i++) {
      exSing_ptr[i] = extractSingle[i];
    }
    
    // assign: 7. extractPairs
    plhs[6] = mxCreateCellArray(2, extract_dims);

    for (int i=0; i<num_nodes; i++) {

      int exPair_i_dim[2] = {1,mrf->neighbNum(i)};
      mxArray* exPair_i = mxCreateNumericArray(2, exPair_i_dim, mxDOUBLE_CLASS, mxREAL);
      double* exPair_i_ptr = mxGetPr(exPair_i);
      for (int n=0; n<mrf->neighbNum(i); n++) {
	exPair_i_ptr[n] = extractPairs[i][n];
      }

      mxSetCell(plhs[6], i, exPair_i);
    }
    
  }

  // **************************************************************************
  // free memory
  // **************************************************************************

  delete mrf;
  mrf = 0;
  delete adjMat;
  adjMat = 0;
  if (countingNode != 0) {
    delete[] countingNode;
    countingNode = 0;
  }
}