Skip to content
Snippets Groups Projects
MexGetMinMax.cpp 4.08 KiB
#include "MexCommand.h"
#include "../Cuda/Vec.h"
#include "../Cuda/CWrappers.h"
#include "../Cuda/ImageDimensions.cuh"
#include "../Cuda/ImageContainer.h"
#include "MexKernel.h"

void MexGetMinMax::execute(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) const
{
	int device = 0;

	if (!mxIsEmpty(prhs[1]))
		device = mat_to_c((int)mxGetScalar(prhs[1]));

	ImageDimensions imageDims;
	if (mxIsLogical(prhs[0]))
	{
		bool* imageInPtr, minVal, maxVal;
		setupImagePointers(prhs[0], &imageInPtr, imageDims);

		getMinMax(imageInPtr, imageDims.getNumElements(), minVal, maxVal, device);
		plhs[0] = mxCreateDoubleScalar(minVal);
		plhs[1] = mxCreateDoubleScalar(maxVal);
	}
	else if (mxIsUint8(prhs[0]))
	{
		unsigned char* imageInPtr, minVal, maxVal;
		setupImagePointers(prhs[0], &imageInPtr, imageDims);

		getMinMax(imageInPtr, imageDims.getNumElements(), minVal, maxVal, device);
		plhs[0] = mxCreateDoubleScalar(minVal);
		plhs[1] = mxCreateDoubleScalar(maxVal);
	}
	else if (mxIsUint16(prhs[0]))
	{
		unsigned short* imageInPtr, minVal, maxVal;
		setupImagePointers(prhs[0], &imageInPtr, imageDims);

		getMinMax(imageInPtr, imageDims.getNumElements(), minVal, maxVal, device);
		plhs[0] = mxCreateDoubleScalar(minVal);
		plhs[1] = mxCreateDoubleScalar(maxVal);
	}
	else if (mxIsInt16(prhs[0]))
	{
		short* imageInPtr, minVal, maxVal;
		setupImagePointers(prhs[0], &imageInPtr, imageDims);

		getMinMax(imageInPtr, imageDims.getNumElements(), minVal, maxVal, device);
		plhs[0] = mxCreateDoubleScalar(minVal);
		plhs[1] = mxCreateDoubleScalar(maxVal);
	}
	else if (mxIsUint32(prhs[0]))
	{
		unsigned int* imageInPtr, minVal, maxVal;
		setupImagePointers(prhs[0], &imageInPtr, imageDims);

		getMinMax(imageInPtr, imageDims.getNumElements(), minVal, maxVal, device);
		plhs[0] = mxCreateDoubleScalar(minVal);
		plhs[1] = mxCreateDoubleScalar(maxVal);
	}
	else if (mxIsInt32(prhs[0]))
	{
		int* imageInPtr, minVal, maxVal;
		setupImagePointers(prhs[0], &imageInPtr, imageDims);

		getMinMax(imageInPtr, imageDims.getNumElements(), minVal, maxVal, device);
		plhs[0] = mxCreateDoubleScalar(minVal);
		plhs[1] = mxCreateDoubleScalar(maxVal);
	}
	else if (mxIsSingle(prhs[0]))
	{
		float* imageInPtr, minVal, maxVal;
		setupImagePointers(prhs[0], &imageInPtr, imageDims);

		getMinMax(imageInPtr, imageDims.getNumElements(), minVal, maxVal, device);
		plhs[0] = mxCreateDoubleScalar(minVal);
		plhs[1] = mxCreateDoubleScalar(maxVal);
	}
	else if (mxIsDouble(prhs[0]))
	{
		double* imageInPtr, minVal, maxVal;
		setupImagePointers(prhs[0], &imageInPtr, imageDims);

		getMinMax(imageInPtr, imageDims.getNumElements(), minVal, maxVal, device);
		plhs[0] = mxCreateDoubleScalar(minVal);
		plhs[1] = mxCreateDoubleScalar(maxVal);
	}
	else
	{
		mexErrMsgTxt("Image type not supported!");
	}
}

std::string MexGetMinMax::check(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) const
{
	if (nrhs < 1 || nrhs > 2)
		return "Incorrect number of inputs!";

	if (nlhs != 2)
		return "Requires two outputs!";

	size_t imgNumDims = mxGetNumberOfDimensions(prhs[0]);
	if (imgNumDims > 5)
		return "Image can have a maximum of five dimensions!";

	return "";
}

void MexGetMinMax::usage(std::vector<std::string>& outArgs, std::vector<std::string>& inArgs) const
{
	inArgs.push_back("arrayIn");
	inArgs.push_back("[device]");
	outArgs.push_back("minValue");
	outArgs.push_back("maxValue");
}

void MexGetMinMax::help(std::vector<std::string>& helpLines) const
{
	helpLines.push_back("This function finds the lowest and highest value in the array that is passed in.");

	helpLines.push_back("\timageIn = This is a one to five dimensional array.");
	helpLines.push_back("");

	helpLines.push_back("\tdevice (optional) = Use this if you have multiple devices and want to select one explicitly.");
	helpLines.push_back("\t\tSetting this to [] allows the algorithm to either pick the best device and/or will try to split");
	helpLines.push_back("\t\tthe data across multiple devices.");
	helpLines.push_back("");

	helpLines.push_back("\tminValue = This is the lowest value found in the array.");
	helpLines.push_back("\tmaxValue = This is the highest value found in the array.");
}