Add uniqueByRows.

This commit is contained in:
sunwen
2023-06-14 11:01:21 +08:00
parent 98545c4bce
commit 802e51f7f2
2 changed files with 87 additions and 0 deletions

View File

@@ -123,6 +123,45 @@ namespace {
des[3] = outputPtr[3];
}
bool compare(const Matrix& aA, const Matrix& aB)
{
size_t dataSize = aA.getDataSize();
size_t sizeB = aB.getDataSize();
if(dataSize > sizeB)
{
dataSize = sizeB;
}
for(size_t i=0; i<dataSize; ++i)
{
if(aA[i] != aB[i])
{
return aA[i] < aB[i];
}
}
return false;
}
bool isEqual(const Matrix& aA, const Matrix& aB)
{
size_t sizeA = aA.getDataSize();
size_t sizeB = aB.getDataSize();
if(sizeA != sizeB)
{
return false;
}
for(size_t i=0; i<sizeA; ++i)
{
if(aA[i] != aB[i])
{
return false;
}
}
return true;
}
}
@@ -1068,3 +1107,49 @@ Matrix Aurora::convertfp16tofloat(short* aData, int aRows, int aColumns)
}
return Matrix::New(output,aRows,aColumns,1);
}
Matrix Aurora::uniqueByRows(const Matrix& aMatrix, Matrix& aIndexResult)
{
if(aMatrix.isNull())
{
return Matrix();
}
Matrix transposeMatrix = transpose(aMatrix);
double* transposeMatrixData = transposeMatrix.getData();
int rows = transposeMatrix.getDimSize(0);
int columns = transposeMatrix.getDimSize(1);
std::vector<Matrix> uniqueResult;
for(int i=1; i<=columns; ++i)
{
Matrix rowData = Matrix::fromRawData(new double[rows], rows);
std::copy(transposeMatrixData, transposeMatrixData + rows, rowData.getData());
uniqueResult.push_back(rowData);
transposeMatrixData += rows;
}
std::vector<Matrix> matrixsCopy = uniqueResult;
std::sort(uniqueResult.begin(), uniqueResult.end(), compare);
auto uniqueIndex = std::unique(uniqueResult.begin(), uniqueResult.end(), isEqual);
uniqueResult.erase(uniqueIndex, uniqueResult.end());
std::vector<double> indexResultData;
for(int i=0; i<matrixsCopy.size();++i)
{
auto index = lower_bound(uniqueResult.begin(), uniqueResult.end(), matrixsCopy[i], compare);
int value = distance(uniqueResult.begin(), index);
indexResultData.push_back(value);
}
aIndexResult = Matrix::copyFromRawData(indexResultData.data(), indexResultData.size());
size_t resultSize = rows * uniqueResult.size();
double* resultData = new double[resultSize];
Matrix result = Matrix::fromRawData(resultData, rows, uniqueResult.size()) ;
for(size_t i=0; i<uniqueResult.size(); ++i)
{
std::copy(uniqueResult[i].getData(), uniqueResult[i].getData() + rows, resultData);
resultData += rows;
}
result = transpose(result);
return result;
}

View File

@@ -94,6 +94,8 @@ namespace Aurora {
Matrix deleteColumn(const Matrix& aMatrix, int aColumnIndex);
Matrix createVectorMatrix(double aStartValue, double aStepValue, double aEndValue);
Matrix uniqueByRows(const Matrix& aMatrix, Matrix& aIndexResult);
/**
* 并集
* @param aIa, [C,ia,~] = intersect(A,B)用法中ia的返回值