Add isfinite and isnan and their test.
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
//必须在Eigen之前
|
//必须在Eigen之前
|
||||||
#include "AuroraDefs.h"
|
#include "AuroraDefs.h"
|
||||||
|
#include "Function3D.h"
|
||||||
#include "Matrix.h"
|
#include "Matrix.h"
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
@@ -747,6 +748,22 @@ void Aurora::nantoval(Matrix& aMatrix, double val2) {
|
|||||||
srcV = srcV.array().isNaN().select(val2,srcV);
|
srcV = srcV.array().isNaN().select(val2,srcV);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Matrix Aurora::isnan(Matrix& aMatrix){
|
||||||
|
Eigen::Map<Eigen::VectorXd> srcV(aMatrix.getData(),aMatrix.getDataSize());
|
||||||
|
auto result = zeros(aMatrix.getDimSize(0),aMatrix.getDimSize(1),aMatrix.getDimSize(2));
|
||||||
|
Eigen::Map<Eigen::VectorXd> resultV(result.getData(),result.getDataSize());
|
||||||
|
resultV = srcV.array().isNaN().select(1.0,resultV);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix Aurora::isfinite(Matrix& aMatrix){
|
||||||
|
Eigen::Map<Eigen::VectorXd> srcV(aMatrix.getData(),aMatrix.getDataSize());
|
||||||
|
auto result = zeros(aMatrix.getDimSize(0),aMatrix.getDimSize(1),aMatrix.getDimSize(2));
|
||||||
|
Eigen::Map<Eigen::VectorXd> resultV(result.getData(),result.getDataSize());
|
||||||
|
resultV = srcV.array().isFinite().select(1.0,resultV);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void Aurora::padding(Matrix &aMatrix, int aIndex, double aValue)
|
void Aurora::padding(Matrix &aMatrix, int aIndex, double aValue)
|
||||||
{
|
{
|
||||||
if(aMatrix.isNull() || !aMatrix.isVector())
|
if(aMatrix.isNull() || !aMatrix.isVector())
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#define AURORA_FUNCTION1D_H
|
#define AURORA_FUNCTION1D_H
|
||||||
|
|
||||||
#include "Matrix.h"
|
#include "Matrix.h"
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
namespace Aurora {
|
namespace Aurora {
|
||||||
|
|
||||||
@@ -104,6 +105,11 @@ namespace Aurora {
|
|||||||
*/
|
*/
|
||||||
void nantoval(Matrix& aMatrix,double val);
|
void nantoval(Matrix& aMatrix,double val);
|
||||||
|
|
||||||
|
|
||||||
|
Matrix isnan(Matrix& aMatrix);
|
||||||
|
|
||||||
|
Matrix isfinite(Matrix& aMatrix);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 使用特定值补齐矩阵,默认为设置原数据矩阵数据到制定长度索引的所有值为制定值
|
* 使用特定值补齐矩阵,默认为设置原数据矩阵数据到制定长度索引的所有值为制定值
|
||||||
* @attention 直接在原数据上进行修改!
|
* @attention 直接在原数据上进行修改!
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
#include <limits>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "MatlabReader.h"
|
#include "MatlabReader.h"
|
||||||
@@ -522,5 +523,24 @@ TEST_F(Function1D_Test, convertfp16tofloat) {
|
|||||||
for (size_t i = 0; i<count; i++) {
|
for (size_t i = 0; i<count; i++) {
|
||||||
EXPECT_EQ(result[i], output.getData()[i])<<"index:"<<i<<",input:"<<input.get()[i];
|
EXPECT_EQ(result[i], output.getData()[i])<<"index:"<<i<<",input:"<<input.get()[i];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(Function1D_Test, nanAndFinite){
|
||||||
|
double n=std::nan("");
|
||||||
|
double infinite=std::numeric_limits<double>::infinity();
|
||||||
|
|
||||||
|
double* data = new double[9]{infinite,3,n,2,2,1,4,4,7};
|
||||||
|
auto matrix = Aurora::Matrix::fromRawData(data, 9,1,1);
|
||||||
|
auto r = Aurora::isnan(matrix);
|
||||||
|
EXPECT_DOUBLE_EQ(r.getData()[0],0);
|
||||||
|
EXPECT_DOUBLE_EQ(r.getData()[1],0);
|
||||||
|
EXPECT_DOUBLE_EQ(r.getData()[2],1);
|
||||||
|
|
||||||
|
r = Aurora::isfinite(matrix);
|
||||||
|
EXPECT_DOUBLE_EQ(r.getData()[0],0);
|
||||||
|
EXPECT_DOUBLE_EQ(r.getData()[1],1);
|
||||||
|
EXPECT_DOUBLE_EQ(r.getData()[2],0);
|
||||||
|
|
||||||
|
Aurora::nantoval(matrix,1);
|
||||||
|
EXPECT_DOUBLE_EQ(matrix.getData()[2],1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user