Blender V4.3
math_solvers.c File Reference
#include "BLI_math_base.h"
#include "BLI_math_matrix.h"
#include "BLI_math_solvers.h"
#include "BLI_math_vector.h"
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
#include "eigen_capi.h"
#include <string.h>
#include "BLI_strict_flags.h"

Go to the source code of this file.

Functions

bool BLI_eigen_solve_selfadjoint_m3 (const float m3[3][3], float r_eigen_values[3], float r_eigen_vectors[3][3])
 Compute the eigen values and/or vectors of given 3D symmetric (aka adjoint) matrix.
 
void BLI_svd_m3 (const float m3[3][3], float r_U[3][3], float r_S[3], float r_V[3][3])
 Compute the SVD (Singular Values Decomposition) of given 3D matrix (m3 = USV*).
 
bool BLI_tridiagonal_solve (const float *a, const float *b, const float *c, const float *d, float *r_x, const int count)
 Solve a tridiagonal system of equations:
 
bool BLI_tridiagonal_solve_cyclic (const float *a, const float *b, const float *c, const float *d, float *r_x, const int count)
 Solve a possibly cyclic tridiagonal system using the Sherman-Morrison formula.
 
bool BLI_newton3d_solve (Newton3D_DeltaFunc func_delta, Newton3D_JacobianFunc func_jacobian, Newton3D_CorrectionFunc func_correction, void *userdata, float epsilon, int max_iterations, bool trace, const float x_init[3], float result[3])
 Solve a generic f(x) = 0 equation using Newton's method.
 

Function Documentation

◆ BLI_eigen_solve_selfadjoint_m3()

bool BLI_eigen_solve_selfadjoint_m3 ( const float m3[3][3],
float r_eigen_values[3],
float r_eigen_vectors[3][3] )

Compute the eigen values and/or vectors of given 3D symmetric (aka adjoint) matrix.

Parameters
m3the 3D symmetric matrix.
Returns
r_eigen_values the computed eigen values (NULL if not needed).
r_eigen_vectors the computed eigen vectors (NULL if not needed).

Definition at line 25 of file math_solvers.c.

References BLI_assert, and EIG_self_adjoint_eigen_solve().

Referenced by mesh_calc_eigen_matrix().

◆ BLI_newton3d_solve()

bool BLI_newton3d_solve ( Newton3D_DeltaFunc func_delta,
Newton3D_JacobianFunc func_jacobian,
Newton3D_CorrectionFunc func_correction,
void * userdata,
float epsilon,
int max_iterations,
bool trace,
const float x_init[3],
float result[3] )

Solve a generic f(x) = 0 equation using Newton's method.

Parameters
func_deltaCallback computing the value of f(x).
func_jacobianCallback computing the Jacobian matrix of the function at x.
func_correctionCallback for forcing the search into an arbitrary custom domain. May be NULL.
userdataData for the callbacks.
epsilonDesired precision.
max_iterationsLimit on the iterations.
traceEnables logging to console.
x_initInitial solution vector.
resultFinal result.
Returns
true if success

Definition at line 154 of file math_solvers.c.

References CLAMP_MIN, copy_v3_v3(), invert_m3(), l, len_squared_v3(), len_v3(), mul_v3_fl(), mul_v3_m3v3(), printf, sqrtf, and sub_v3_v3v3().

Referenced by target_project_solve_point_tri().

◆ BLI_svd_m3()

void BLI_svd_m3 ( const float m3[3][3],
float r_U[3][3],
float r_S[3],
float r_V[3][3] )

Compute the SVD (Singular Values Decomposition) of given 3D matrix (m3 = USV*).

Parameters
m3the matrix to decompose.
Returns
r_U the computed left singular vector of m3 (NULL if not needed).
r_S the computed singular values of m3 (NULL if not needed).
r_V the computed right singular vector of m3 (NULL if not needed).

Definition at line 40 of file math_solvers.c.

References EIG_svd_square_matrix().

Referenced by mat3_polar_decompose().

◆ BLI_tridiagonal_solve()

bool BLI_tridiagonal_solve ( const float * a,
const float * b,
const float * c,
const float * d,
float * r_x,
int count )

Solve a tridiagonal system of equations:

a[i] * r_x[i-1] + b[i] * r_x[i] + c[i] * r_x[i+1] = d[i]

Ignores a[0] and c[count-1]. Uses the Thomas algorithm, e.g. see wiki.

Parameters
r_xoutput vector, may be shared with any of the input ones
Returns
true if success

Definition at line 47 of file math_solvers.c.

References b, count, double(), float, MEM_freeN(), and MEM_mallocN.

Referenced by BLI_tridiagonal_solve_cyclic(), TEST(), and TEST().

◆ BLI_tridiagonal_solve_cyclic()

bool BLI_tridiagonal_solve_cyclic ( const float * a,
const float * b,
const float * c,
const float * d,
float * r_x,
int count )

Solve a possibly cyclic tridiagonal system using the Sherman-Morrison formula.

Parameters
r_xoutput vector, may be shared with any of the input ones
Returns
true if success

Definition at line 91 of file math_solvers.c.

References b, BLI_tridiagonal_solve(), count, float, MEM_freeN(), and MEM_mallocN.

Referenced by TEST(), TEST(), TEST(), and tridiagonal_solve_with_limits().