From 7e9b8cf4e2ed9479c935bad1e838f2efcedf93cb Mon Sep 17 00:00:00 2001 From: kradchen Date: Thu, 8 Jun 2023 14:05:28 +0800 Subject: [PATCH] Add != to matrix --- src/Matrix.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/Matrix.h | 4 ++++ 2 files changed, 56 insertions(+) diff --git a/src/Matrix.cpp b/src/Matrix.cpp index b4ef6c7..6d782a5 100644 --- a/src/Matrix.cpp +++ b/src/Matrix.cpp @@ -1163,6 +1163,58 @@ namespace Aurora { return Matrix::New(ret, matrix.getDimSize(0), matrix.getDimSize(1), matrix.getDimSize(2)); } + Matrix Matrix::operator!=(double aScalar) const { + if (isComplex()) { + std::cerr << "Complex cann't compare!" << std::endl; + return Matrix(); + } + Eigen::Map v(getData(), getDataSize()); + double *ret = malloc(getDataSize()); + Eigen::Map result(ret, getDataSize()); + result.setConstant(0.0); + result = (v.array() != aScalar).select(1.0, result); + return New(ret, getDimSize(0), getDimSize(1), getDimSize(2)); + } + + Matrix operator!=(double aScalar, const Matrix &matrix) { + if (matrix.isComplex()) { + std::cerr << "Complex cann't compare!" << std::endl; + return Matrix(); + } + Eigen::Map v(matrix.getData(), matrix.getDataSize()); + double *ret = malloc(matrix.getDataSize()); + Eigen::Map result(ret, matrix.getDataSize()); + result.setConstant(0.0); + result = (aScalar != v.array() ).select(1.0, result); + return Matrix::New(ret, matrix.getDimSize(0), matrix.getDimSize(1), matrix.getDimSize(2)); + } + + Matrix Matrix::operator!=(const Matrix &matrix) const { + if (isComplex() || matrix.isComplex()) { + std::cerr << "Complex cann't compare!" << std::endl; + return Matrix(); + } + if (!compareShape(matrix) && !isScalar() && !matrix.isScalar()) { + std::cerr << "Matrix not equal, matrix 1(" << matrix.getDimSize(0) << "," << matrix.getDimSize(1) << "," + << matrix.getDimSize(2) << "), matrix 2(" << getDimSize(0) << "," << getDimSize(1) << "," + << getDimSize(2) << ")" << std::endl; + return Matrix(); + } + if(isScalar()){ + return getData()[0]!=matrix; + } + if(matrix.isScalar()){ + return (*this)!=matrix.getData()[0]; + } + Eigen::Map v(getData(), getDataSize()); + Eigen::Map v2(matrix.getData(), matrix.getDataSize()); + double *ret = malloc(matrix.getDataSize()); + Eigen::Map result(ret, matrix.getDataSize()); + result.setConstant(0.0); + result = (v.array() != v2.array()).select(1.0, result); + return Matrix::New(ret, matrix.getDimSize(0), matrix.getDimSize(1), matrix.getDimSize(2)); + } + Matrix operator-(Matrix &&aMatrix) { int size = aMatrix.getDataSize()*aMatrix.getValueType(); double zero = 0.0; diff --git a/src/Matrix.h b/src/Matrix.h index 779d28c..2f52a05 100644 --- a/src/Matrix.h +++ b/src/Matrix.h @@ -169,6 +169,10 @@ namespace Aurora { friend Matrix operator==(double aScalar, const Matrix &matrix); Matrix operator==(const Matrix &matrix) const; + Matrix operator!=(double aScalar) const; + friend Matrix operator!=(double aScalar, const Matrix &matrix); + Matrix operator!=(const Matrix &matrix) const; + // sub double& operator[](size_t index); double operator[](size_t index) const;