diff options
author | Wim van Aarle <wimvanaarle@gmail.com> | 2015-02-26 16:11:38 +0100 |
---|---|---|
committer | Wim van Aarle <wimvanaarle@gmail.com> | 2015-02-26 16:11:38 +0100 |
commit | 169e912d2633cda7ffc234e78afba1b096e122ea (patch) | |
tree | b9dc0bdbf200056abb942e0be2840640a470b896 /matlab/mex/mexHelpFunctions.cpp | |
parent | 2d11dcfc8d85cd562a36c192f5dda64c8378d160 (diff) | |
download | astra-169e912d2633cda7ffc234e78afba1b096e122ea.tar.gz astra-169e912d2633cda7ffc234e78afba1b096e122ea.tar.bz2 astra-169e912d2633cda7ffc234e78afba1b096e122ea.tar.xz astra-169e912d2633cda7ffc234e78afba1b096e122ea.zip |
code cleanup
Diffstat (limited to 'matlab/mex/mexHelpFunctions.cpp')
-rw-r--r-- | matlab/mex/mexHelpFunctions.cpp | 601 |
1 files changed, 205 insertions, 396 deletions
diff --git a/matlab/mex/mexHelpFunctions.cpp b/matlab/mex/mexHelpFunctions.cpp index c25123a..c0ac711 100644 --- a/matlab/mex/mexHelpFunctions.cpp +++ b/matlab/mex/mexHelpFunctions.cpp @@ -38,307 +38,154 @@ $Id$ #include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/classification.hpp> -#include "astra/SparseMatrixProjectionGeometry2D.h" -#include "astra/FanFlatVecProjectionGeometry2D.h" -#include "astra/AstraObjectManager.h" - using namespace std; using namespace astra; //----------------------------------------------------------------------------------------- // get string from matlab -std::string mex_util_get_string(const mxArray* pInput) +string mexToString(const mxArray* pInput) { - if (!mxIsChar(pInput)) { - return ""; + // is string? + if (mxIsChar(pInput)) { + mwSize iLength = mxGetNumberOfElements(pInput) + 1; + char* buf = new char[iLength]; + mxGetString(pInput, buf, iLength); + std::string res = std::string(buf); + delete[] buf; + return res; } - mwSize iLength = mxGetNumberOfElements(pInput) + 1; - char* buf = new char[iLength]; - mxGetString(pInput, buf, iLength); - std::string res = std::string(buf); - delete[] buf; - return res; + + // is scalar? + if (mxIsNumeric(pInput) && mxGetM(pInput)*mxGetN(pInput) == 1) { + return boost::lexical_cast<string>(mxGetScalar(pInput)); + } + + return ""; } //----------------------------------------------------------------------------------------- -// is option -bool isOption(std::list<std::string> lOptions, std::string sOption) +// return true if the argument is a scalar +bool mexIsScalar(const mxArray* pInput) { - return std::find(lOptions.begin(), lOptions.end(), sOption) != lOptions.end(); + return (mxIsNumeric(pInput) && mxGetM(pInput)*mxGetN(pInput) == 1); } //----------------------------------------------------------------------------------------- -// turn a matlab struct into a c++ map -std::map<std::string, mxArray*> parseStruct(const mxArray* pInput) +void get3DMatrixDims(const mxArray* x, mwSize *dims) { - std::map<std::string, mxArray*> res; - - // check type - if (!mxIsStruct(pInput)) { - mexErrMsgTxt("Input must be a struct."); - return res; + const mwSize* mdims = mxGetDimensions(x); + mwSize dimCount = mxGetNumberOfDimensions(x); + if (dimCount == 1) { + dims[0] = mdims[0]; + dims[1] = 1; + dims[2] = 1; + } else if (dimCount == 2) { + dims[0] = mdims[0]; + dims[1] = mdims[1]; + dims[2] = 1; + } else if (dimCount == 3) { + dims[0] = mdims[0]; + dims[1] = mdims[1]; + dims[2] = mdims[2]; + } else { + dims[0] = 0; + dims[1] = 0; + dims[2] = 0; } +} + + + + - // get field names - int nfields = mxGetNumberOfFields(pInput); - for (int i = 0; i < nfields; i++) { - std::string sFieldName = std::string(mxGetFieldNameByNumber(pInput, i)); - res[sFieldName] = mxGetFieldByNumber(pInput,0,i); - } - return res; -} //----------------------------------------------------------------------------------------- -// turn a c++ map into a matlab struct -mxArray* buildStruct(std::map<std::string, mxArray*> mInput) +// turn an std vector<float32> object to an mxArray +mxArray* vectorToMxArray(std::vector<astra::float32> mInput) { - mwSize dims[2] = {1, 1}; - mxArray* res = mxCreateStructArray(2,dims,0,0); - - for (std::map<std::string, mxArray*>::iterator it = mInput.begin(); it != mInput.end(); it++) { - mxAddField(res, (*it).first.c_str()); - mxSetField(res, 0, (*it).first.c_str(), (*it).second); + mxArray* res = mxCreateDoubleMatrix(1, mInput.size(), mxREAL); + double* pdData = mxGetPr(res); + for (unsigned int i = 0; i < mInput.size(); i++) { + pdData[i] = mInput[i]; } return res; } //----------------------------------------------------------------------------------------- -// parse projection geometry data -astra::CProjectionGeometry2D* parseProjectionGeometryStruct(const mxArray* prhs) +// turn a vector<vector<float32>> object to an mxArray +mxArray* vector2DToMxArray(std::vector<std::vector<astra::float32> > mInput) { - // parse struct - std::map<string, mxArray*> mStruct = parseStruct(prhs); - - // create projection geometry object - string type = mex_util_get_string(mStruct["type"]); - if (type == "parallel") { - - // detector_width - float32 fDetWidth = 1.0f; - mxArray* tmp = mStruct["detector_width"]; - if (tmp != NULL) { - fDetWidth = (float32)(mxGetScalar(tmp)); - } - - // detector_count - int iDetCount = 100; - tmp = mStruct["detector_count"]; - if (tmp != NULL) { - iDetCount = (int)(mxGetScalar(tmp)); - } - - // angles - float32* pfAngles; - int iAngleCount; - tmp = mStruct["projection_angles"]; - if (tmp != NULL) { - double* angleValues = mxGetPr(tmp); - iAngleCount = mxGetN(tmp) * mxGetM(tmp); - pfAngles = new float32[iAngleCount]; - for (int i = 0; i < iAngleCount; i++) { - pfAngles[i] = angleValues[i]; - } - } else { - mexErrMsgTxt("'angles' not specified, error."); - return NULL; - } - - // create projection geometry - return new astra::CParallelProjectionGeometry2D(iAngleCount, // number of projections - iDetCount, // number of detectors - fDetWidth, // width of the detectors - pfAngles); // angles array - } - - else if (type == "fanflat") { - - // detector_width - float32 fDetWidth = 1.0f; - mxArray* tmp = mStruct["detector_width"]; - if (tmp != NULL) { - fDetWidth = (float32)(mxGetScalar(tmp)); - } - - // detector_count - int iDetCount = 100; - tmp = mStruct["detector_count"]; - if (tmp != NULL) { - iDetCount = (int)(mxGetScalar(tmp)); - } - - // angles - float32* pfAngles; - int iAngleCount; - tmp = mStruct["projection_angles"]; - if (tmp != NULL) { - double* angleValues = mxGetPr(tmp); - iAngleCount = mxGetN(tmp) * mxGetM(tmp); - pfAngles = new float32[iAngleCount]; - for (int i = 0; i < iAngleCount; i++) { - pfAngles[i] = angleValues[i]; - } - } else { - mexErrMsgTxt("'angles' not specified, error."); - return NULL; - } - - // origin_source_dist - int iDistOriginSource = 100; - tmp = mStruct["origin_source_dist"]; - if (tmp != NULL) { - iDistOriginSource = (int)(mxGetScalar(tmp)); - } + unsigned int sizex = mInput.size(); + if (sizex == 0) return mxCreateString("empty"); + unsigned int sizey = mInput[0].size(); - // origin_det_dist - int iDistOriginDet = 100; - tmp = mStruct["origin_det_dist"]; - if (tmp != NULL) { - iDistOriginDet = (int)(mxGetScalar(tmp)); + mxArray* res = mxCreateDoubleMatrix(sizex, sizey, mxREAL); + double* pdData = mxGetPr(res); + for (unsigned int i = 0; i < sizex; i++) { + for (unsigned int j = 0; j < sizey && j < mInput[i].size(); j++) { + pdData[j*sizex+i] = mInput[i][j]; } - - // create projection geometry - return new astra::CFanFlatProjectionGeometry2D(iAngleCount, // number of projections - iDetCount, // number of detectors - fDetWidth, // width of the detectors - pfAngles, // angles array - iDistOriginSource, // distance origin source - iDistOriginDet); // distance origin detector - } - - else { - mexPrintf("Only parallel and fanflat projection geometry implemented."); - return NULL; } + return res; } //----------------------------------------------------------------------------------------- -// parse reconstruction geometry data -astra::CVolumeGeometry2D* parseVolumeGeometryStruct(const mxArray* prhs) +// turn a boost::any object to an mxArray +mxArray* anyToMxArray(boost::any _any) { - // parse struct - std::map<string, mxArray*> mStruct = parseStruct(prhs); - - std::map<string, mxArray*> mOptions = parseStruct(mStruct["option"]); - - // GridColCount - int iWindowColCount = 128; - mxArray* tmp = mStruct["GridColCount"]; - if (tmp != NULL) { - iWindowColCount = (int)(mxGetScalar(tmp)); - } - - // GridRowCount - int iWindowRowCount = 128; - tmp = mStruct["GridRowCount"]; - if (tmp != NULL) { - iWindowRowCount = (int)(mxGetScalar(tmp)); + if (_any.type() == typeid(std::string)) { + std::string str = boost::any_cast<std::string>(_any); + return mxCreateString(str.c_str()); } - - // WindowMinX - float32 fWindowMinX = - iWindowColCount / 2; - tmp = mOptions["WindowMinX"]; - if (tmp != NULL) { - fWindowMinX = (float32)(mxGetScalar(tmp)); - } - - // WindowMaxX - float32 fWindowMaxX = iWindowColCount / 2; - tmp = mOptions["WindowMaxX"]; - if (tmp != NULL) { - fWindowMaxX = (float32)(mxGetScalar(tmp)); - } - - // WindowMinY - float32 fWindowMinY = - iWindowRowCount / 2; - tmp = mOptions["WindowMinY"]; - if (tmp != NULL) { - fWindowMinY = (float32)(mxGetScalar(tmp)); - } - - // WindowMaxX - float32 fWindowMaxY = iWindowRowCount / 2; - tmp = mOptions["WindowMaxY"]; - if (tmp != NULL) { - fWindowMaxY = (float32)(mxGetScalar(tmp)); - } - - // create and return reconstruction geometry - return new astra::CVolumeGeometry2D(iWindowColCount, iWindowRowCount, - fWindowMinX, fWindowMinY, - fWindowMaxX, fWindowMaxY); + if (_any.type() == typeid(int)) { + return mxCreateDoubleScalar(boost::any_cast<int>(_any)); + } + if (_any.type() == typeid(float32)) { + return mxCreateDoubleScalar(boost::any_cast<float32>(_any)); + } + if (_any.type() == typeid(std::vector<astra::float32>)) { + return vectorToMxArray(boost::any_cast<std::vector<float32> >(_any)); + } + if (_any.type() == typeid(std::vector<std::vector<astra::float32> >)) { + return vector2DToMxArray(boost::any_cast<std::vector<std::vector<float32> > >(_any)); + } + return NULL; } -//----------------------------------------------------------------------------------------- -string matlab2string(const mxArray* pField) -{ - // is string? - if (mxIsChar(pField)) { - return mex_util_get_string(pField); - } - // is scalar? - if (mxIsNumeric(pField) && mxGetM(pField)*mxGetN(pField) == 1) { - return boost::lexical_cast<string>(mxGetScalar(pField)); - } - return ""; -} + + + + //----------------------------------------------------------------------------------------- -// Options struct to xml node -bool readOptions(XMLNode* node, const mxArray* pOptionStruct) +// turn a MATLAB struct into a Config object +Config* structToConfig(string rootname, const mxArray* pStruct) { - // loop all fields - int nfields = mxGetNumberOfFields(pOptionStruct); - for (int i = 0; i < nfields; i++) { - std::string sFieldName = std::string(mxGetFieldNameByNumber(pOptionStruct, i)); - const mxArray* pField = mxGetFieldByNumber(pOptionStruct, 0, i); + if (!mxIsStruct(pStruct)) { + mexErrMsgTxt("Input must be a struct."); + return NULL; + } - if (node->hasOption(sFieldName)) { - mexErrMsgTxt("Duplicate option"); - return false; - } - - // string or scalar - if (mxIsChar(pField) || mex_is_scalar(pField)) { - string sValue = matlab2string(pField); - node->addOption(sFieldName, sValue); - } else - // numerical array - if (mxIsNumeric(pField) && mxGetM(pField)*mxGetN(pField) > 1) { - if (!mxIsDouble(pField)) { - mexErrMsgTxt("Numeric input must be double."); - return false; - } + // create the document + Config* cfg = new Config(); + cfg->initialize(rootname); - XMLNode* listbase = node->addChildNode("Option"); - listbase->addAttribute("key", sFieldName); - listbase->addAttribute("listsize", mxGetM(pField)*mxGetN(pField)); - double* pdValues = mxGetPr(pField); - int index = 0; - for (unsigned int row = 0; row < mxGetM(pField); row++) { - for (unsigned int col = 0; col < mxGetN(pField); col++) { - XMLNode* item = listbase->addChildNode("ListItem"); - item->addAttribute("index", index); - item->addAttribute("value", pdValues[col*mxGetM(pField)+row]); - index++; - delete item; - } - } - delete listbase; - } else { - mexErrMsgTxt("Unsupported option type"); - return false; - } + // read the struct + bool ret = structToXMLNode(cfg->self, pStruct); + if (!ret) { + delete cfg; + mexErrMsgTxt("Error parsing struct."); + return NULL; } - return true; + return cfg; } //----------------------------------------------------------------------------------------- -// struct to xml node -bool readStruct(XMLNode* root, const mxArray* pStruct) +bool structToXMLNode(XMLNode* node, const mxArray* pStruct) { // loop all fields int nfields = mxGetNumberOfFields(pStruct); @@ -350,27 +197,27 @@ bool readStruct(XMLNode* root, const mxArray* pStruct) // string if (mxIsChar(pField)) { - string sValue = matlab2string(pField); + string sValue = mexToString(pField); if (sFieldName == "type") { - root->addAttribute("type", sValue); + node->addAttribute("type", sValue); } else { - delete root->addChildNode(sFieldName, sValue); + delete node->addChildNode(sFieldName, sValue); } } // scalar - if (mex_is_scalar(pField)) { - string sValue = matlab2string(pField); - delete root->addChildNode(sFieldName, sValue); + else if (mxIsNumeric(pField) && mxGetM(pField)*mxGetN(pField) == 1) { + string sValue = mexToString(pField); + delete node->addChildNode(sFieldName, sValue); } // numerical array - if (mxIsNumeric(pField) && mxGetM(pField)*mxGetN(pField) > 1) { + else if (mxIsNumeric(pField) && mxGetM(pField)*mxGetN(pField) > 1) { if (!mxIsDouble(pField)) { mexErrMsgTxt("Numeric input must be double."); return false; } - XMLNode* listbase = root->addChildNode(sFieldName); + XMLNode* listbase = node->addChildNode(sFieldName); listbase->addAttribute("listsize", mxGetM(pField)*mxGetN(pField)); double* pdValues = mxGetPr(pField); int index = 0; @@ -386,16 +233,15 @@ bool readStruct(XMLNode* root, const mxArray* pStruct) delete listbase; } - // not castable to a single string - if (mxIsStruct(pField)) { + else if (mxIsStruct(pField)) { if (sFieldName == "options" || sFieldName == "option" || sFieldName == "Options" || sFieldName == "Option") { - bool ret = readOptions(root, pField); + bool ret = optionsToXMLNode(node, pField); if (!ret) return false; } else { - XMLNode* newNode = root->addChildNode(sFieldName); - bool ret = readStruct(newNode, pField); + XMLNode* newNode = node->addChildNode(sFieldName); + bool ret = structToXMLNode(newNode, pField); delete newNode; if (!ret) return false; @@ -406,93 +252,74 @@ bool readStruct(XMLNode* root, const mxArray* pStruct) return true; } - //----------------------------------------------------------------------------------------- -// turn a MATLAB struct into an XML Document -XMLDocument* struct2XML(string rootname, const mxArray* pStruct) +// Options struct to xml node +bool optionsToXMLNode(XMLNode* node, const mxArray* pOptionStruct) { - if (!mxIsStruct(pStruct)) { - mexErrMsgTxt("Input must be a struct."); - return NULL; - } - - // create the document - XMLDocument* doc = XMLDocument::createDocument(rootname); - XMLNode* rootnode = doc->getRootNode(); - - // read the struct - bool ret = readStruct(rootnode, pStruct); - delete rootnode; - - if (!ret) { - delete doc; - doc = 0; - } - - return doc; -} - - - + // loop all fields + int nfields = mxGetNumberOfFields(pOptionStruct); + for (int i = 0; i < nfields; i++) { + std::string sFieldName = std::string(mxGetFieldNameByNumber(pOptionStruct, i)); + const mxArray* pField = mxGetFieldByNumber(pOptionStruct, 0, i); + if (node->hasOption(sFieldName)) { + mexErrMsgTxt("Duplicate option"); + return false; + } + + // string or scalar + if (mxIsChar(pField) || mexIsScalar(pField)) { + string sValue = mexToString(pField); + node->addOption(sFieldName, sValue); + } + // numerical array + else if (mxIsNumeric(pField) && mxGetM(pField)*mxGetN(pField) > 1) { + if (!mxIsDouble(pField)) { + mexErrMsgTxt("Numeric input must be double."); + return false; + } -//----------------------------------------------------------------------------------------- -// turn an std vector<float32> object to an mxArray -mxArray* vectorToMxArray(std::vector<astra::float32> mInput) -{ - mxArray* res = mxCreateDoubleMatrix(1, mInput.size(), mxREAL); - double* pdData = mxGetPr(res); - for (unsigned int i = 0; i < mInput.size(); i++) { - pdData[i] = mInput[i]; + XMLNode* listbase = node->addChildNode("Option"); + listbase->addAttribute("key", sFieldName); + listbase->addAttribute("listsize", mxGetM(pField)*mxGetN(pField)); + double* pdValues = mxGetPr(pField); + int index = 0; + for (unsigned int row = 0; row < mxGetM(pField); row++) { + for (unsigned int col = 0; col < mxGetN(pField); col++) { + XMLNode* item = listbase->addChildNode("ListItem"); + item->addAttribute("index", index); + item->addAttribute("value", pdValues[col*mxGetM(pField)+row]); + index++; + delete item; + } + } + delete listbase; + } else { + mexErrMsgTxt("Unsupported option type"); + return false; + } } - return res; + return true; } - //----------------------------------------------------------------------------------------- -// turn a vector<vector<float32>> object to an mxArray -mxArray* vector2DToMxArray(std::vector<std::vector<astra::float32> > mInput) +// turn a matlab struct into a c++ map +std::map<std::string, mxArray*> parseStruct(const mxArray* pInput) { - unsigned int sizex = mInput.size(); - if (sizex == 0) return mxCreateString("empty"); - unsigned int sizey = mInput[0].size(); + std::map<std::string, mxArray*> res; - mxArray* res = mxCreateDoubleMatrix(sizex, sizey, mxREAL); - double* pdData = mxGetPr(res); - for (unsigned int i = 0; i < sizex; i++) { - for (unsigned int j = 0; j < sizey && j < mInput[i].size(); j++) { - pdData[j*sizex+i] = mInput[i][j]; - } + // check type + if (!mxIsStruct(pInput)) { + mexErrMsgTxt("Input must be a struct."); + return res; } - return res; -} -//----------------------------------------------------------------------------------------- -// turn a boost::any object to an mxArray -mxArray* anyToMxArray(boost::any _any) -{ - if (_any.type() == typeid(std::string)) { - std::string str = boost::any_cast<std::string>(_any); - return mxCreateString(str.c_str()); - } - if (_any.type() == typeid(int)) { - return mxCreateDoubleScalar(boost::any_cast<int>(_any)); - } - if (_any.type() == typeid(float32)) { - return mxCreateDoubleScalar(boost::any_cast<float32>(_any)); - } - if (_any.type() == typeid(std::vector<astra::float32>)) { - return vectorToMxArray(boost::any_cast<std::vector<float32> >(_any)); - } - if (_any.type() == typeid(std::vector<std::vector<astra::float32> >)) { - return vector2DToMxArray(boost::any_cast<std::vector<std::vector<float32> > >(_any)); + // get field names + int nfields = mxGetNumberOfFields(pInput); + for (int i = 0; i < nfields; i++) { + std::string sFieldName = std::string(mxGetFieldNameByNumber(pInput, i)); + res[sFieldName] = mxGetFieldByNumber(pInput,0,i); } - return NULL; -} -//----------------------------------------------------------------------------------------- -// return true ig the argument is a scalar -bool mex_is_scalar(const mxArray* pInput) -{ - return (mxIsNumeric(pInput) && mxGetM(pInput)*mxGetN(pInput) == 1); + return res; } @@ -509,18 +336,41 @@ bool mex_is_scalar(const mxArray* pInput) //----------------------------------------------------------------------------------------- +// turn a Config object into a MATLAB struct mxArray* configToStruct(astra::Config* cfg) { - return XMLNode2struct(cfg->self); + return XMLNodeToStruct(cfg->self); } //----------------------------------------------------------------------------------------- -mxArray* XML2struct(astra::XMLDocument* xml) +mxArray* XMLNodeToStruct(astra::XMLNode* node) { - XMLNode* node = xml->getRootNode(); - mxArray* str = XMLNode2struct(xml->getRootNode()); - delete node; - return str; + std::map<std::string, mxArray*> mList; + std::map<std::string, mxArray*> mOptions; + + // type_attribute + if (node->hasAttribute("type")) { + mList["type"] = mxCreateString(node->getAttribute("type").c_str()); + } + + list<XMLNode*> nodes = node->getNodes(); + for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) { + XMLNode* subnode = (*it); + + // option + if (subnode->getName() == "Option") { + mOptions[subnode->getAttribute("key")] = stringToMxArray(subnode->getAttribute("value")); + } + + // regular content + else { + mList[subnode->getName()] = stringToMxArray(subnode->getContent()); + } + delete subnode; + } + + if (mOptions.size() > 0) mList["options"] = buildStruct(mOptions); + return buildStruct(mList); } //----------------------------------------------------------------------------------------- @@ -583,36 +433,18 @@ mxArray* stringToMxArray(std::string input) // string return mxCreateString(input.c_str()); } - //----------------------------------------------------------------------------------------- -mxArray* XMLNode2struct(astra::XMLNode* node) +// turn a c++ map into a matlab struct +mxArray* buildStruct(std::map<std::string, mxArray*> mInput) { - std::map<std::string, mxArray*> mList; - std::map<std::string, mxArray*> mOptions; - - // type_attribute - if (node->hasAttribute("type")) { - mList["type"] = mxCreateString(node->getAttribute("type").c_str()); - } - - list<XMLNode*> nodes = node->getNodes(); - for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) { - XMLNode* subnode = (*it); - - // option - if (subnode->getName() == "Option") { - mOptions[subnode->getAttribute("key")] = stringToMxArray(subnode->getAttribute("value")); - } - - // regular content - else { - mList[subnode->getName()] = stringToMxArray(subnode->getContent()); - } - delete subnode; + mwSize dims[2] = {1, 1}; + mxArray* res = mxCreateStructArray(2,dims,0,0); + + for (std::map<std::string, mxArray*>::iterator it = mInput.begin(); it != mInput.end(); it++) { + mxAddField(res, (*it).first.c_str()); + mxSetField(res, 0, (*it).first.c_str(), (*it).second); } - - if (mOptions.size() > 0) mList["options"] = buildStruct(mOptions); - return buildStruct(mList); + return res; } @@ -624,26 +456,3 @@ mxArray* XMLNode2struct(astra::XMLNode* node) -//----------------------------------------------------------------------------------------- -void get3DMatrixDims(const mxArray* x, mwSize *dims) -{ - const mwSize* mdims = mxGetDimensions(x); - mwSize dimCount = mxGetNumberOfDimensions(x); - if (dimCount == 1) { - dims[0] = mdims[0]; - dims[1] = 1; - dims[2] = 1; - } else if (dimCount == 2) { - dims[0] = mdims[0]; - dims[1] = mdims[1]; - dims[2] = 1; - } else if (dimCount == 3) { - dims[0] = mdims[0]; - dims[1] = mdims[1]; - dims[2] = mdims[2]; - } else { - dims[0] = 0; - dims[1] = 0; - dims[2] = 0; - } -} |