void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { if(nrhs!=1) mexErrMsgTxt("One input required."); btkMXCheckNoOuput(nlhs, plhs); // Only when there is no output for the function. btk::Acquisition::Pointer acq = btk_MOH_get_object<btk::Acquisition>(prhs[0]); btk::MetaData::Pointer metadata = acq->GetMetaData(); btk::MetaData::ConstIterator itAnalysis = metadata->FindChild("ANALYSIS"); if (itAnalysis == metadata->End()) return; // Char const char* names[] = {"NAMES", "CONTEXTS", "SUBJECTS", "UNITS", "DESCRIPTIONS"}; int numberOfNames = sizeof(names) / sizeof(char*); std::vector<uint8_t> dims = std::vector<uint8_t>(2,0); for (int i = 0 ; i < numberOfNames ; ++i) { btk::MetaData::ConstIterator it = (*itAnalysis)->FindChild(names[i]); if (it != (*itAnalysis)->End()) { if ((*it)->HasInfo()) (*it)->GetInfo()->SetDimensions(dims); } } // Real btk::MetaData::ConstIterator it = (*itAnalysis)->FindChild("VALUES"); if (it != (*itAnalysis)->End()) { if ((*it)->HasInfo()) (*it)->GetInfo()->SetDimensions(std::vector<uint8_t>(1,0)); } // Integer btk::MetaDataCreateChild((*itAnalysis), "USED", (int16_t)0); };
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { if (nrhs != 2) mexErrMsgTxt("Two inputs required."); btkMXCheckNoOuput(nlhs, plhs); // Only when there is no output for the function. if ((mxGetClassID(prhs[1]) != mxDOUBLE_CLASS) || mxIsEmpty(prhs[1]) || mxIsComplex(prhs[1])) mexErrMsgTxt("The second input must be a matrix of real (double) values corresponding to points values."); // First output btk::Acquisition::Pointer acq = btk_MOH_get_object<btk::Acquisition>(prhs[0]); int numberOfValuesPerPoint = acq->GetPointFrameNumber(); int numberOfPoints = acq->GetPointNumber(); if (mxGetNumberOfElements(prhs[1]) != numberOfPoints*numberOfValuesPerPoint) mexErrMsgTxt("The second input doesn't have the same size than the number of points values."); double* values = mxGetPr(prhs[1]); int i = 0; int j = numberOfValuesPerPoint; double* v = 0; btk::Acquisition::PointIterator it = acq->BeginPoint(); while (i < numberOfPoints * numberOfValuesPerPoint) { if (j >= numberOfValuesPerPoint) { v = (*it)->GetResiduals().data(); ++it; j = 0; } v[j] = values[i]; i+=1; j+=1; } };