Add removeDataFromArrays.

Fix dataFilter to use transparams.
This commit is contained in:
sunwen
2023-05-25 16:19:08 +08:00
parent 5bd7a15238
commit 9837c425d1
8 changed files with 84 additions and 21 deletions

View File

@@ -0,0 +1,46 @@
#include "removeDataFromArrays.h"
#include "Function.h"
#include "Function1D.h"
#include "Function2D.h"
#include "Matrix.h"
#include <cstddef>
#include <vector>
using namespace Recon;
using namespace Aurora;
Aurora::Matrix Recon::removeDataFromArrays(const Aurora::Matrix& aOutPutMatrix, const Aurora::Matrix& aRemoveList)
{
// Matrix result = aOutPutMatrix;
// int minusNum = 0;
// for(int i=0; i<aRemoveList.getDataSize(); ++i)
// {
// if(aRemoveList[i] == 0)
// {
// result = deleteColumn(result, i - minusNum);
// ++minusNum;
// }
// }
// return result;
size_t columnSize = sum(aRemoveList, FunctionDirection::All)[0];
double* resultData = Aurora::malloc(columnSize * aOutPutMatrix.getDimSize(0));
Matrix result = Matrix::New(resultData, aOutPutMatrix.getDimSize(0), columnSize);
std::vector<std::pair<int,int>> copyList;
size_t length = 0;
for(size_t i=0; i<aRemoveList.getDataSize(); ++i)
{
if(aRemoveList[i] == 1)
{
++length;
}
if(aRemoveList[i] == 0 && length != 0)
{
copyList.push_back({});
length = 0;
}
}
}

View File

@@ -0,0 +1,11 @@
#ifndef REMOVEDATAFROMARRAYS_H
#define REMOVEDATAFROMARRAYS_H
#include "Matrix.h"
namespace Recon
{
Aurora::Matrix removeDataFromArrays(const Aurora::Matrix& aOutPutMatrix, const Aurora::Matrix& aRemoveList);
}
#endif

View File

@@ -3,21 +3,22 @@
#include "Function2D.h"
#include "Function3D.h"
#include "src/config/config.h"
#define PI 3.141592653589793238462
using namespace Aurora;
namespace Recon {
Matrix filterReflectionData(const Matrix &aVReceiverPositionBlock,
const Matrix &aVSenderPositionBlock,
const Matrix &aVSenderNormalBlock,
int aConstrictReflectionAngles,
double aAngleLowerLimit, double aAngleUpperLimit) {
int aConstrictReflectionAngles) {
auto reflectData = ones(1, aVReceiverPositionBlock.getDimSize(1));
if (aConstrictReflectionAngles == 1) {
auto positionDifs = aVReceiverPositionBlock - aVSenderPositionBlock;
auto inbetweenAngle = acos(dot(aVSenderNormalBlock, positionDifs) /
vecnorm(positionDifs, Norm2, 1));
auto flags = Aurora::auroraNot((inbetweenAngle < (PI * aAngleLowerLimit / 180)) +
(inbetweenAngle > (PI * aAngleUpperLimit / 180)));
auto flags = Aurora::auroraNot((inbetweenAngle < (PI * transParams::angleLowerLimit / 180)) +
(inbetweenAngle > (PI * transParams::angleUpperLimit / 180)));
reflectData = reflectData * flags;
}
return reflectData;

View File

@@ -6,9 +6,7 @@ namespace Recon {
Aurora::Matrix filterReflectionData(const Aurora::Matrix &aVReceiverPositionBlock,
const Aurora::Matrix &aVSenderPositionBlock,
const Aurora::Matrix &aVSenderNormalBlock,
int aConstrictReflectionAngles,
double aAngleLowerLimit,
double aAngleUpperLimit);
int aConstrictReflectionAngles);
}

View File

@@ -1,4 +1,5 @@
#include "dataFilter.h"
#include "src/config/config.h"
#include <cmath>
#include <cstddef>
@@ -79,18 +80,17 @@ namespace Recon {
return sosValues;
}
Aurora::Matrix filterTransmissionData(int aFilterSensitivity, const Aurora::Matrix &aVslBlock,
Aurora::Matrix filterTransmissionData(const Aurora::Matrix &aVslBlock,
const Aurora::Matrix &aVsnBlock, const Aurora::Matrix &aVrlBlock,
const Aurora::Matrix &aVrnBlock, std::vector<Aurora::Matrix> &aMSensData,
const Aurora::Matrix &aMSenderNormalBlock,
const Aurora::Matrix &aMReceiverNormalBlock,
double* params)
const Aurora::Matrix &aMReceiverNormalBlock)
{
switch (aFilterSensitivity) {
switch (transParams::filterSensitivity) {
case 1:
return filterTransmissionSensitivityMap(params[0], aVslBlock, aVsnBlock, aVrlBlock, aVrnBlock, aMSensData);
return filterTransmissionSensitivityMap(transParams::sensFilter, aVslBlock, aVsnBlock, aVrlBlock, aVrnBlock, aMSensData);
case 2:
return filterTransmissionAngle(params[0], params[1], aMSenderNormalBlock, aMReceiverNormalBlock);
return filterTransmissionAngle(transParams::angleLowerLimit, transParams::angleUpperLimit, aMSenderNormalBlock, aMReceiverNormalBlock);
}
std::cerr<<"FilterSensitivity value error!"<<std::endl;
return Aurora::Matrix();

View File

@@ -25,7 +25,6 @@ Aurora::Matrix checkTofDetections(Aurora::Matrix &aVTofValues,
/**
* filterTransmissionData
*
* @param aFilterSensitivity
* @param aVslBlock
* @param aVsnBlock
* @param aVrlBlock
@@ -33,17 +32,15 @@ Aurora::Matrix checkTofDetections(Aurora::Matrix &aVTofValues,
* @param aMSensData
* @param aMSenderNormalBlock
* @param aMReceiverNormalBlock
* @param params
* 如果aFilterSensitivity为1单个值sensFilter如果为2双值angleLowerLimit,
* angleUpperLimit
* @return Aurora::Matrix
*/
Aurora::Matrix filterTransmissionData(
int aFilterSensitivity, const Aurora::Matrix &aVslBlock,
Aurora::Matrix filterTransmissionData( const Aurora::Matrix &aVslBlock,
const Aurora::Matrix &aVsnBlock, const Aurora::Matrix &aVrlBlock,
const Aurora::Matrix &aVrnBlock, std::vector<Aurora::Matrix> &aMSensData,
const Aurora::Matrix &aMSenderNormalBlock,
const Aurora::Matrix &aMReceiverNormalBlock, double *params);
const Aurora::Matrix &aMReceiverNormalBlock);
Aurora::Matrix findDefectTransmissionData(const Aurora::Matrix &aVSNRList,double aSNRDifference);

View File

@@ -8,6 +8,7 @@
#include "common/getGeometryInfo.h"
#include "common/dataBlockCreation/getAscanBlock.h"
#include "common/dataBlockCreation/blockingGeometryInfo.h"
#include "common/dataBlockCreation/removeDataFromArrays.h"
#include "Parser.h"
#include "MatlabReader.h"
@@ -328,3 +329,14 @@ TEST_F(Common_Test, blockingGeometryInfos) {
EXPECT_DOUBLE_AE(senderPositionBlock[i], result.senderPositionBlock[i]);
}
}
TEST_F(Common_Test, removeDataFromArrays) {
Aurora::Matrix a = Aurora::Matrix::fromRawData(new double[8]{1,2,3,4,5,6,7,8}, 1,8);
Aurora::Matrix b = Aurora::Matrix::fromRawData(new double[8]{0,0,1,1,1,1,0,0}, 1,8);
auto result = Recon::removeDataFromArrays(a, b);
EXPECT_DOUBLE_EQ(result.getDataSize(), 4);
EXPECT_DOUBLE_EQ(result[0], 3);
EXPECT_DOUBLE_EQ(result[1], 4);
EXPECT_DOUBLE_EQ(result[2], 5);
EXPECT_DOUBLE_EQ(result[3], 6);
}

View File

@@ -122,9 +122,7 @@ TEST_F(DataFilter_Test, filterReflectionData) {
auto senderPositionBlock = Aurora::transpose(Aurora::Matrix::fromRawData(new double[9]{-0.12,-0.12,-0.12,-0.01,-0.01,-0.01,0.03,0.03,0.03}, 3, 3));
auto senderNormalBlock = Aurora::transpose(Aurora::Matrix::fromRawData(new double[9]{0.99,0.99,0.99,0.10,0.10,0.10,0,0,0}, 3, 3));
int constrictReflectionAngles = 1;
double lowerAngle = 45;
double upperAngle = 360;
auto result = Recon::filterReflectionData(receiverPositionBlock, senderPositionBlock, senderNormalBlock, constrictReflectionAngles, lowerAngle, upperAngle);
auto result = Recon::filterReflectionData(receiverPositionBlock, senderPositionBlock, senderNormalBlock, constrictReflectionAngles);
EXPECT_EQ(3, result.getDataSize());
EXPECT_DOUBLE_AE(result[0],1);
EXPECT_DOUBLE_AE(result[1],1);