MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ normalize_inplace()

MAYAFLUX_API void MayaFlux::Kinesis::Vision::normalize_inplace ( std::span< float >  data)

Stretch values to fill [0, 1] using the span's observed min and max.

No-op if min == max. Operates in-place.

Parameters
dataFloat span to normalise in-place.

Definition at line 333 of file PixelOps.cpp.

334{
335 if (data.empty())
336 return;
337
338 const Eigen::Index en = static_cast<Eigen::Index>(data.size());
339 auto m = Eigen::Map<Eigen::ArrayXf>(data.data(), en);
340 const float mn = m.minCoeff();
341 const float mx = m.maxCoeff();
342 const float range = mx - mn;
343 if (range == 0.0F)
344 return;
345
346 const float inv = 1.0F / range;
347 float* out = data.data();
348 const size_t n = data.size();
349
350#ifdef MAYAFLUX_ARCH_X64
351 const __m256 v_mn = _mm256_set1_ps(mn);
352 const __m256 v_inv = _mm256_set1_ps(inv);
353 size_t i = 0;
354 for (; i + 8 <= n; i += 8) {
355 __m256 v = _mm256_loadu_ps(out + i);
356 _mm256_storeu_ps(out + i, _mm256_mul_ps(_mm256_sub_ps(v, v_mn), v_inv));
357 }
358 for (; i < n; ++i)
359 out[i] = (out[i] - mn) * inv;
360
361#elif defined(MAYAFLUX_ARCH_ARM64)
362 const float32x4_t v_mn = vdupq_n_f32(mn);
363 const float32x4_t v_inv = vdupq_n_f32(inv);
364 size_t i = 0;
365 for (; i + 4 <= n; i += 4) {
366 float32x4_t v = vld1q_f32(out + i);
367 vst1q_f32(out + i, vmulq_f32(vsubq_f32(v, v_mn), v_inv));
368 }
369 for (; i < n; ++i)
370 out[i] = (out[i] - mn) * inv;
371
372#else
373 std::transform(std::execution::par_unseq, data.begin(), data.end(), data.begin(),
374 [mn, inv](float v) { return (v - mn) * inv; });
375#endif
376}
std::vector< float > * out

References out.