void runKernelTransform(MatlabImportFilter::Pointer matlabImport, MatlabExportFilter::Pointer matlabExport) { // check number of input arguments (the kernel transform syntax // accepts up to 4 arguments only. Thus, we cannot use InputIndexType_MAX) matlabImport->CheckNumberOfArguments(4, 4); // retrieve pointers to the inputs that we are going to need here typedef MatlabImportFilter::MatlabInputPointer MatlabInputPointer; MatlabInputPointer inX = matlabImport->GetRegisteredInput("X"); MatlabInputPointer inY = matlabImport->GetRegisteredInput("Y"); MatlabInputPointer inXI = matlabImport->GetRegisteredInput("XI"); // register the outputs for this function at the export filter typedef MatlabExportFilter::MatlabOutputPointer MatlabOutputPointer; MatlabOutputPointer outYI = matlabExport->RegisterOutput(OUT_YI, "YI"); // get size of input arguments mwSize Mx = mxGetM(inX->pm); // number of source points mwSize Mxi = mxGetM(inXI->pm); // number of points to be warped mwSize ndimxi; // number of dimension of points to be warped const mwSize *dimsxi; // dimensions vector of array of points to be warped // create pointers to input matrices TScalarType *x = (TScalarType *)mxGetData(inX->pm); // source points TScalarType *y = (TScalarType *)mxGetData(inY->pm); // target points TScalarType *xi = (TScalarType *)mxGetData(inXI->pm); // points to be warped if (x == NULL) { mexErrMsgTxt("Cannot get a pointer to input X"); } if (y == NULL) { mexErrMsgTxt("Cannot get a pointer to input Y"); } if (xi == NULL) { mexErrMsgTxt("Cannot get a pointer to input XI"); } // type definitions and variables to store points for the kernel transform typedef typename TransformType::PointSetType PointSetType; typename PointSetType::Pointer fixedPointSet = PointSetType::New(); typename PointSetType::Pointer movingPointSet = PointSetType::New(); typename PointSetType::Pointer toWarpPointSet = PointSetType::New(); typedef typename PointSetType::PointsContainer PointsContainer; typename PointsContainer::Pointer fixedPointContainer = PointsContainer::New(); typename PointsContainer::Pointer movingPointContainer = PointsContainer::New(); typedef typename PointSetType::PointType PointType; PointType fixedPoint; PointType movingPoint; PointType toWarpPoint; PointType warpedPoint; // duplicate the input x and y matrices to PointSet format so that // we can pass it to the ITK function mwSize pointId=0; for (mwSize row=0; row < Mx; ++row) { for (mwSize col=0; col < (mwSize)Dimension; ++col) { fixedPoint[CAST2MWSIZE(col)] = y[Mx * col + row]; movingPoint[CAST2MWSIZE(col)] = x[Mx * col + row]; } fixedPointContainer->InsertElement(pointId, fixedPoint); movingPointContainer->InsertElement(pointId, movingPoint); ++pointId; } fixedPointSet->SetPoints(fixedPointContainer); movingPointSet->SetPoints(movingPointContainer); // compute the transform typename TransformType::Pointer transform; transform = TransformType::New(); transform->SetSourceLandmarks(movingPointSet); transform->SetTargetLandmarks(fixedPointSet); transform->ComputeWMatrix(); // create output vector and pointer to populate it ndimxi = mxGetNumberOfDimensions(inXI->pm); dimsxi = mxGetDimensions(inXI->pm); std::vector<mwSize> size; for (mwIndex i = 0; i < ndimxi; ++i) { size.push_back(dimsxi[i]); } TScalarType *yi = matlabExport->AllocateNDArrayInMatlab<TScalarType>(outYI, size); // transform points for (mwSize row=0; row < Mxi; ++row) { for (mwSize col=0; col < (mwSize)Dimension; ++col) { toWarpPoint[CAST2MWSIZE(col)] = xi[Mxi * col + row]; } warpedPoint = transform->TransformPoint(toWarpPoint); for (mwSize col=0; col < (mwSize)Dimension; ++col) { yi[Mxi * col + row] = warpedPoint[CAST2MWSIZE(col)]; } } // exit function return; }