34 const float *cos_vn = data->
cos_vn;
35 const float *center = data->center;
36 float *r_covmat = data->r_covmat;
37 const int n = data->n;
38 const int cos_vn_num = data->cos_vn_num;
60 for (k = 0; k < cos_vn_num; k++) {
61 r_covmat[a] += (cos_vn[k * n + i] - center[i]) * (cos_vn[k * n + j] - center[j]);
65 for (k = 0; k < cos_vn_num; k++) {
66 r_covmat[a] += cos_vn[k * n + i] * cos_vn[k * n + j];
69 r_covmat[a] *= data->covfac;
72 r_covmat[j * n + i] = r_covmat[a];
80 const bool use_sample_correction,
86 const float covfac = 1.0f / (
float)(use_sample_correction ? cos_vn_num - 1 : cos_vn_num);
88 memset(r_covmat, 0,
sizeof(*r_covmat) * (
size_t)(n * n));
96 .cos_vn_num = cos_vn_num,
101 settings.use_threading = ((cos_vn_num * n * n) >= 10000);
106 const int cos_v3_num,
107 const bool use_sample_correction,
108 float r_covmat[3][3],
112 const float mean_fac = 1.0f / (
float)cos_v3_num;
116 for (i = 0; i < cos_v3_num; i++) {
126 3, (
const float *)cos_v3, cos_v3_num, center, use_sample_correction, (
float *)r_covmat);
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void zero_v3(float r[3])
void BLI_task_parallel_range(int start, int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
BLI_INLINE void BLI_parallel_range_settings_defaults(TaskParallelSettings *settings)
draw_view in_light_buf[] float
static void covariance_m_vn_ex_task_cb(void *__restrict userdata, const int a, const TaskParallelTLS *__restrict UNUSED(tls))
struct CovarianceData CovarianceData
void BLI_covariance_m3_v3n(const float(*cos_v3)[3], const int cos_v3_num, const bool use_sample_correction, float r_covmat[3][3], float r_center[3])
Compute the covariance matrix of given set of 3D coordinates.
void BLI_covariance_m_vn_ex(const int n, const float *cos_vn, const int cos_vn_num, const float *center, const bool use_sample_correction, float *r_covmat)
Compute the covariance matrix of given set of nD coordinates.