1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-29 15:23:05 +04:00

Help compiler vectorize loops in meanSplit

Otherwise, it does not know dataset_, mean_ and var_ do not
overlap.
This commit is contained in:
Vincent Rabaud
2026-02-13 13:40:38 +01:00
parent a8d26a042b
commit feee8b202d
@@ -46,6 +46,11 @@
#include "random.h"
#include "saving.h"
#if defined(__clang__) || defined(__GNUC__)
#define CV_RESTRICT __restrict__
#else
#define CV_RESTRICT
#endif
namespace cvflann
{
@@ -320,9 +325,7 @@ private:
int cnt = std::min((int)SAMPLE_MEAN+1, count);
for (int j = 0; j < cnt; ++j) {
ElementType* v = dataset_[ind[j]];
for (size_t k=0; k<veclen_; ++k) {
mean_[k] += v[k];
}
Sum(v, veclen_, mean_);
}
for (size_t k=0; k<veclen_; ++k) {
mean_[k] /= cnt;
@@ -331,10 +334,7 @@ private:
/* Compute variances (no need to divide by count). */
for (int j = 0; j < cnt; ++j) {
ElementType* v = dataset_[ind[j]];
for (size_t k=0; k<veclen_; ++k) {
DistanceType dist = v[k] - mean_[k];
var_[k] += dist * dist;
}
Var(v, mean_, veclen_, var_);
}
/* Select one of the highest variance indices at random. */
cutfeat = selectDivision(var_);
@@ -584,6 +584,18 @@ private:
RAND_DIM=5
};
void Sum(const ElementType* CV_RESTRICT data, size_t len, DistanceType* CV_RESTRICT mean) {
for (size_t k=0; k<len; ++k) {
mean[k] += data[k];
}
}
void Var(const ElementType* CV_RESTRICT data, const DistanceType* CV_RESTRICT mean, size_t len, DistanceType*CV_RESTRICT var) {
for (size_t k=0; k<len; ++k) {
DistanceType dist = data[k] - mean[k];
var[k] += dist * dist;
}
}
/**
* Number of randomized trees that are used