diff --git a/src/Function2D.cpp b/src/Function2D.cpp index 7906834..d41236e 100644 --- a/src/Function2D.cpp +++ b/src/Function2D.cpp @@ -257,51 +257,53 @@ Matrix Aurora::max(const Matrix &aMatrix, FunctionDirection direction) { } Matrix Aurora::max(const Matrix &aMatrix, FunctionDirection direction, long& rowIdx, long& colIdx) { - if (aMatrix.getDimSize(2)>1 || aMatrix.isComplex()) { + if (aMatrix.getDimSize(2)>1) { std::cerr - << (aMatrix.getDimSize(2) > 1 ? "max() not support 3D data!" : "max() not support complex value type!") + << "max() not support 3D data!" << std::endl; return Matrix(); } + auto calcMatrix = aMatrix.isComplex()?abs(aMatrix):aMatrix; + //针对向量行等于列 - if (direction == Column && aMatrix.getDimSize(0)==1){ + if (direction == Column && calcMatrix.getDimSize(0)==1){ direction = All; } switch (direction) { case All: { - Eigen::Map retV(aMatrix.getData(), aMatrix.getDimSize(0), aMatrix.getDimSize(1)); + Eigen::Map retV(calcMatrix.getData(), calcMatrix.getDimSize(0), calcMatrix.getDimSize(1)); double *ret = malloc(1); ret[0] = retV.array().maxCoeff(&rowIdx, &colIdx); return Matrix::New(ret,1); } case Row: { - Eigen::Map srcMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1)); - double * ret = malloc(aMatrix.getDimSize(0)); - if (aMatrix.getDimSize(0) == 1){ + Eigen::Map srcMatrix(calcMatrix.getData(),calcMatrix.getDimSize(0),calcMatrix.getDimSize(1)); + double * ret = malloc(calcMatrix.getDimSize(0)); + if (calcMatrix.getDimSize(0) == 1){ ret[0] = srcMatrix.topRows(0).maxCoeff(&rowIdx, &colIdx); } else{ - Eigen::Map retMatrix(ret,aMatrix.getDimSize(0),1); + Eigen::Map retMatrix(ret,calcMatrix.getDimSize(0),1); retMatrix = srcMatrix.rowwise().maxCoeff(); } - return Matrix::New(ret,aMatrix.getDimSize(0),1); + return Matrix::New(ret,calcMatrix.getDimSize(0),1); } case Column: default: { - Eigen::Map srcMatrix(aMatrix.getData(),aMatrix.getDimSize(0),aMatrix.getDimSize(1)); - double * ret = malloc(aMatrix.getDimSize(0)); - if (aMatrix.getDimSize(1) == 1){ + Eigen::Map srcMatrix(calcMatrix.getData(),calcMatrix.getDimSize(0),calcMatrix.getDimSize(1)); + double * ret = malloc(calcMatrix.getDimSize(0)); + if (calcMatrix.getDimSize(1) == 1){ ret[0] = srcMatrix.col(0).maxCoeff(&rowIdx, &colIdx); } else { - Eigen::Map retMatrix(ret,1,aMatrix.getDimSize(1)); + Eigen::Map retMatrix(ret,1,calcMatrix.getDimSize(1)); retMatrix = srcMatrix.colwise().maxCoeff(); } - return Matrix::New(ret,1,aMatrix.getDimSize(1)); + return Matrix::New(ret,1,calcMatrix.getDimSize(1)); } } }