58 inline void Compute(
const T a,
const T b) {
64 T t = T(1)/FMath::Sqrt(d);
80 T t = T(1)/FMath::Sqrt(d);
107 for (
int j = 0; j < 2; j++) {
117 for (
int j = 0; j < 3; j++) {
134 for (
int j = 0; j < 2; j++) {
144 for (
int j = 0; j < 3; j++) {
200 if (H.M[0][1] != (T)0.)
201 r2.Compute(H.M[0][0] * H.M[1][0] + H.M[0][1] * H.M[1][1], H.M[0][0] * H.M[2][0] + H.M[0][1] * H.M[2][1]);
203 r2.Compute(H.M[1][0], H.M[2][0]);
207 r2.ColumnRotation(H);
208 r2.ColumnRotation(V);
220 r1.ColumnRotation(U);
221 r3.ColumnRotation(U);
275 r1.ColumnRotation(H);
276 r1.ColumnRotation(V);
285 r1.ComputeUnconventional(H.M[2][1], H.M[2][2]);
287 r1.ColumnRotation(U);
297 r2.ColumnRotation(H);
298 r2.ColumnRotation(V);
306 r2.ComputeUnconventional(H.M[1][0], H.M[1][1]);
308 r2.ColumnRotation(U);
368 const T
tol = std::numeric_limits<T>::epsilon()) {
375 T x =
S_Sym.M[0*2+0];
376 T y =
S_Sym.M[1*2+0];
386 T
tau = (T)0.5 * (x - z);
387 T
w = FMath::Sqrt(
tau *
tau + y * y);
398 cosine = (T)1. / FMath::Sqrt(t * t + (T)1.);
434 const PMatrix<T, 2, 2>&
A,
const PMatrix<T, 2, 2>& U,
const TVector<T, 2>& Sigma,
const PMatrix<T, 2, 2>& V,
435 const T
tol = std::numeric_limits<T>::epsilon()) {
456 T d = (T)0.5 * (
a1 -
a2);
467 template <
int t,
class T>
468 inline void Process(
PMatrix<T, 3, 3>&
B,
PMatrix<T, 3, 3>& U,
TVector<T, 3>&
sigma,
PMatrix<T, 3, 3>& V) {
469 int other = (t == 1) ? 0 : 2;
479 B.M[t][t + 1] =
B_sub.M[1];
480 B.M[t + 1][t] =
B_sub.M[2];
481 B.M[t + 1][t + 1] =
B_sub.M[3];
496 U.SetColumn(i, -U.GetColumn(i));
503 A.SetColumn(
i1,
A.GetColumn(
i2));
516 if (
sigma[1] < (T)0.) {
524 if (
sigma[2] < (T)0.) {
543 U.SetColumn(2, -U.GetColumn(2));
544 V.SetColumn(2, -V.GetColumn(2));
557 if (
sigma[0] < (T)0.) {
578 U.SetColumn(1, -U.GetColumn(1));
579 V.SetColumn(1, -V.GetColumn(1));
583 if (
sigma[1] < (T)0.) {
597 inline int SingularValueDecomposition(
const PMatrix<T, 3, 3>&
A,
PMatrix<T, 3, 3>& U,
TVector<T, 3>&
sigma,
PMatrix<T, 3, 3>& V,
598 T
tol = std::numeric_limits<T>::epsilon())
683 r1.ComputeUnconventional(
B.M[2][1],
B.M[2][2]);
685 r1.ColumnRotation(U);
704 r1.Compute(
B.M[1][1],
B.M[2][1]);
705 r1.ColumnRotation(
B);
706 r1.ColumnRotation(V);
714 r2.Compute(
B.M[0][0],
B.M[2][0]);
715 r2.ColumnRotation(
B);
716 r2.ColumnRotation(V);
735 r1.ComputeUnconventional(
B.M[1][0],
B.M[1][1]);
737 r1.ColumnRotation(U);
746 r2.ComputeUnconventional(
B.M[2][0],
B.M[2][2]);
748 r2.ColumnRotation(U);
775 R = V.GetTransposed() * U;
788 dRdF[0 * 9 + 0] = (-
R.GetAt(0, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 2) +
R.GetAt(0, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 1) +
R.GetAt(0, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 2) -
R.GetAt(0, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 1));
789 dRdF[1 * 9 + 0] = (
R.GetAt(0, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 2) -
R.GetAt(0, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 0) -
R.GetAt(0, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 2) +
R.GetAt(0, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 0));
790 dRdF[2 * 9 + 0] = (-
R.GetAt(0, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 1) +
R.GetAt(0, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 0) +
R.GetAt(0, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 1) -
R.GetAt(0, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 0));
791 dRdF[3 * 9 + 0] = (-
R.GetAt(0, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 2) +
R.GetAt(0, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 1) +
R.GetAt(0, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 2) -
R.GetAt(0, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 1));
792 dRdF[4 * 9 + 0] = (
R.GetAt(0, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 2) -
R.GetAt(0, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 0) -
R.GetAt(0, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 2) +
R.GetAt(0, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 0));
793 dRdF[5 * 9 + 0] = (-
R.GetAt(0, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 1) +
R.GetAt(0, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 0) +
R.GetAt(0, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 1) -
R.GetAt(0, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 0));
794 dRdF[6 * 9 + 0] = (-
R.GetAt(0, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 2) +
R.GetAt(0, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 1) +
R.GetAt(0, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 2) -
R.GetAt(0, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 1));
795 dRdF[7 * 9 + 0] = (
R.GetAt(0, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 2) -
R.GetAt(0, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 0) -
R.GetAt(0, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 2) +
R.GetAt(0, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 0));
796 dRdF[8 * 9 + 0] = (-
R.GetAt(0, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 1) +
R.GetAt(0, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 0) +
R.GetAt(0, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 1) -
R.GetAt(0, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 0));
797 dRdF[0 * 9 + 1] = (
R.GetAt(0, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 2) -
R.GetAt(0, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 1) -
R.GetAt(0, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 2) +
R.GetAt(0, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 1));
798 dRdF[1 * 9 + 1] = (-
R.GetAt(0, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 2) +
R.GetAt(0, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 0) +
R.GetAt(0, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 2) -
R.GetAt(0, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 0));
799 dRdF[2 * 9 + 1] = (
R.GetAt(0, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 1) -
R.GetAt(0, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 0) -
R.GetAt(0, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 1) +
R.GetAt(0, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 0));
800 dRdF[3 * 9 + 1] = (
R.GetAt(0, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 2) -
R.GetAt(0, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 1) -
R.GetAt(0, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 2) +
R.GetAt(0, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 1));
801 dRdF[4 * 9 + 1] = (-
R.GetAt(0, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 2) +
R.GetAt(0, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 0) +
R.GetAt(0, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 2) -
R.GetAt(0, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 0));
802 dRdF[5 * 9 + 1] = (
R.GetAt(0, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 1) -
R.GetAt(0, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 0) -
R.GetAt(0, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 1) +
R.GetAt(0, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 0));
803 dRdF[6 * 9 + 1] = (
R.GetAt(0, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 2) -
R.GetAt(0, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 1) -
R.GetAt(0, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 2) +
R.GetAt(0, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 1));
804 dRdF[7 * 9 + 1] = (-
R.GetAt(0, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 2) +
R.GetAt(0, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 0) +
R.GetAt(0, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 2) -
R.GetAt(0, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 0));
805 dRdF[8 * 9 + 1] = (
R.GetAt(0, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 1) -
R.GetAt(0, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 0) -
R.GetAt(0, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 1) +
R.GetAt(0, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 0));
806 dRdF[0 * 9 + 2] = (-
R.GetAt(0, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 2) +
R.GetAt(0, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 1) +
R.GetAt(0, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 2) -
R.GetAt(0, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 1));
807 dRdF[1 * 9 + 2] = (
R.GetAt(0, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 2) -
R.GetAt(0, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 0) -
R.GetAt(0, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 2) +
R.GetAt(0, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 0));
808 dRdF[2 * 9 + 2] = (-
R.GetAt(0, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 1) +
R.GetAt(0, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 0) +
R.GetAt(0, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 1) -
R.GetAt(0, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 0));
809 dRdF[3 * 9 + 2] = (-
R.GetAt(0, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 2) +
R.GetAt(0, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 1) +
R.GetAt(0, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 2) -
R.GetAt(0, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 1));
810 dRdF[4 * 9 + 2] = (
R.GetAt(0, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 2) -
R.GetAt(0, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 0) -
R.GetAt(0, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 2) +
R.GetAt(0, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 0));
811 dRdF[5 * 9 + 2] = (-
R.GetAt(0, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 1) +
R.GetAt(0, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 0) +
R.GetAt(0, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 1) -
R.GetAt(0, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 0));
812 dRdF[6 * 9 + 2] = (-
R.GetAt(0, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 2) +
R.GetAt(0, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 1) +
R.GetAt(0, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 2) -
R.GetAt(0, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 1));
813 dRdF[7 * 9 + 2] = (
R.GetAt(0, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 2) -
R.GetAt(0, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 0) -
R.GetAt(0, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 2) +
R.GetAt(0, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 0));
814 dRdF[8 * 9 + 2] = (-
R.GetAt(0, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 1) +
R.GetAt(0, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 0) +
R.GetAt(0, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 1) -
R.GetAt(0, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 0));
815 dRdF[0 * 9 + 3] = (-
R.GetAt(1, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 2) +
R.GetAt(1, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 1) +
R.GetAt(1, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 2) -
R.GetAt(1, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 1));
816 dRdF[1 * 9 + 3] = (
R.GetAt(1, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 2) -
R.GetAt(1, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 0) -
R.GetAt(1, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 2) +
R.GetAt(1, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 0));
817 dRdF[2 * 9 + 3] = (-
R.GetAt(1, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 1) +
R.GetAt(1, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 0) +
R.GetAt(1, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 1) -
R.GetAt(1, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 0));
818 dRdF[3 * 9 + 3] = (-
R.GetAt(1, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 2) +
R.GetAt(1, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 1) +
R.GetAt(1, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 2) -
R.GetAt(1, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 1));
819 dRdF[4 * 9 + 3] = (
R.GetAt(1, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 2) -
R.GetAt(1, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 0) -
R.GetAt(1, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 2) +
R.GetAt(1, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 0));
820 dRdF[5 * 9 + 3] = (-
R.GetAt(1, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 1) +
R.GetAt(1, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 0) +
R.GetAt(1, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 1) -
R.GetAt(1, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 0));
821 dRdF[6 * 9 + 3] = (-
R.GetAt(1, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 2) +
R.GetAt(1, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 1) +
R.GetAt(1, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 2) -
R.GetAt(1, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 1));
822 dRdF[7 * 9 + 3] = (
R.GetAt(1, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 2) -
R.GetAt(1, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 0) -
R.GetAt(1, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 2) +
R.GetAt(1, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 0));
823 dRdF[8 * 9 + 3] = (-
R.GetAt(1, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 1) +
R.GetAt(1, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 0) +
R.GetAt(1, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 1) -
R.GetAt(1, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 0));
824 dRdF[0 * 9 + 4] = (
R.GetAt(1, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 2) -
R.GetAt(1, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 1) -
R.GetAt(1, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 2) +
R.GetAt(1, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 1));
825 dRdF[1 * 9 + 4] = (-
R.GetAt(1, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 2) +
R.GetAt(1, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 0) +
R.GetAt(1, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 2) -
R.GetAt(1, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 0));
826 dRdF[2 * 9 + 4] = (
R.GetAt(1, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 1) -
R.GetAt(1, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 0) -
R.GetAt(1, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 1) +
R.GetAt(1, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 0));
827 dRdF[3 * 9 + 4] = (
R.GetAt(1, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 2) -
R.GetAt(1, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 1) -
R.GetAt(1, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 2) +
R.GetAt(1, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 1));
828 dRdF[4 * 9 + 4] = (-
R.GetAt(1, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 2) +
R.GetAt(1, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 0) +
R.GetAt(1, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 2) -
R.GetAt(1, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 0));
829 dRdF[5 * 9 + 4] = (
R.GetAt(1, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 1) -
R.GetAt(1, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 0) -
R.GetAt(1, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 1) +
R.GetAt(1, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 0));
830 dRdF[6 * 9 + 4] = (
R.GetAt(1, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 2) -
R.GetAt(1, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 1) -
R.GetAt(1, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 2) +
R.GetAt(1, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 1));
831 dRdF[7 * 9 + 4] = (-
R.GetAt(1, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 2) +
R.GetAt(1, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 0) +
R.GetAt(1, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 2) -
R.GetAt(1, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 0));
832 dRdF[8 * 9 + 4] = (
R.GetAt(1, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 1) -
R.GetAt(1, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 0) -
R.GetAt(1, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 1) +
R.GetAt(1, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 0));
833 dRdF[0 * 9 + 5] = (-
R.GetAt(1, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 2) +
R.GetAt(1, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 1) +
R.GetAt(1, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 2) -
R.GetAt(1, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 1));
834 dRdF[1 * 9 + 5] = (
R.GetAt(1, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 2) -
R.GetAt(1, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 0) -
R.GetAt(1, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 2) +
R.GetAt(1, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 0));
835 dRdF[2 * 9 + 5] = (-
R.GetAt(1, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 1) +
R.GetAt(1, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 0) +
R.GetAt(1, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 1) -
R.GetAt(1, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 0));
836 dRdF[3 * 9 + 5] = (-
R.GetAt(1, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 2) +
R.GetAt(1, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 1) +
R.GetAt(1, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 2) -
R.GetAt(1, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 1));
837 dRdF[4 * 9 + 5] = (
R.GetAt(1, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 2) -
R.GetAt(1, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 0) -
R.GetAt(1, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 2) +
R.GetAt(1, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 0));
838 dRdF[5 * 9 + 5] = (-
R.GetAt(1, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 1) +
R.GetAt(1, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 0) +
R.GetAt(1, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 1) -
R.GetAt(1, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 0));
839 dRdF[6 * 9 + 5] = (-
R.GetAt(1, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 2) +
R.GetAt(1, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 1) +
R.GetAt(1, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 2) -
R.GetAt(1, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 1));
840 dRdF[7 * 9 + 5] = (
R.GetAt(1, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 2) -
R.GetAt(1, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 0) -
R.GetAt(1, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 2) +
R.GetAt(1, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 0));
841 dRdF[8 * 9 + 5] = (-
R.GetAt(1, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 1) +
R.GetAt(1, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 0) +
R.GetAt(1, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 1) -
R.GetAt(1, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 0));
842 dRdF[0 * 9 + 6] = (-
R.GetAt(2, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 2) +
R.GetAt(2, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 1) +
R.GetAt(2, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 2) -
R.GetAt(2, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 1));
843 dRdF[1 * 9 + 6] = (
R.GetAt(2, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 2) -
R.GetAt(2, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 0) -
R.GetAt(2, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 2) +
R.GetAt(2, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 0));
844 dRdF[2 * 9 + 6] = (-
R.GetAt(2, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 1) +
R.GetAt(2, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 0) +
R.GetAt(2, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 1) -
R.GetAt(2, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 0));
845 dRdF[3 * 9 + 6] = (-
R.GetAt(2, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 2) +
R.GetAt(2, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 1) +
R.GetAt(2, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 2) -
R.GetAt(2, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 1));
846 dRdF[4 * 9 + 6] = (
R.GetAt(2, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 2) -
R.GetAt(2, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 0) -
R.GetAt(2, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 2) +
R.GetAt(2, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 0));
847 dRdF[5 * 9 + 6] = (-
R.GetAt(2, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 1) +
R.GetAt(2, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 0) +
R.GetAt(2, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 1) -
R.GetAt(2, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 0));
848 dRdF[6 * 9 + 6] = (-
R.GetAt(2, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 2) +
R.GetAt(2, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 1) +
R.GetAt(2, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 2) -
R.GetAt(2, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 1));
849 dRdF[7 * 9 + 6] = (
R.GetAt(2, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 2) -
R.GetAt(2, 1) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 0) -
R.GetAt(2, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 2) +
R.GetAt(2, 2) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 0));
850 dRdF[8 * 9 + 6] = (-
R.GetAt(2, 1) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 1) +
R.GetAt(2, 1) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 0) +
R.GetAt(2, 2) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 1) -
R.GetAt(2, 2) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 0));
851 dRdF[0 * 9 + 7] = (
R.GetAt(2, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 2) -
R.GetAt(2, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 1) -
R.GetAt(2, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 2) +
R.GetAt(2, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 1));
852 dRdF[1 * 9 + 7] = (-
R.GetAt(2, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 2) +
R.GetAt(2, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(0, 0) +
R.GetAt(2, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 2) -
R.GetAt(2, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 0));
853 dRdF[2 * 9 + 7] = (
R.GetAt(2, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(0, 1) -
R.GetAt(2, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(0, 0) -
R.GetAt(2, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 1) +
R.GetAt(2, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 0));
854 dRdF[3 * 9 + 7] = (
R.GetAt(2, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 2) -
R.GetAt(2, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 1) -
R.GetAt(2, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 2) +
R.GetAt(2, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 1));
855 dRdF[4 * 9 + 7] = (-
R.GetAt(2, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 2) +
R.GetAt(2, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(1, 0) +
R.GetAt(2, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 2) -
R.GetAt(2, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 0));
856 dRdF[5 * 9 + 7] = (
R.GetAt(2, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(1, 1) -
R.GetAt(2, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(1, 0) -
R.GetAt(2, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 1) +
R.GetAt(2, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 0));
857 dRdF[6 * 9 + 7] = (
R.GetAt(2, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 2) -
R.GetAt(2, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 1) -
R.GetAt(2, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 2) +
R.GetAt(2, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 1));
858 dRdF[7 * 9 + 7] = (-
R.GetAt(2, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 2) +
R.GetAt(2, 0) *
Dinv.GetAt(2, 2) *
R.GetAt(2, 0) +
R.GetAt(2, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 2) -
R.GetAt(2, 2) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 0));
859 dRdF[8 * 9 + 7] = (
R.GetAt(2, 0) *
Dinv.GetAt(2, 0) *
R.GetAt(2, 1) -
R.GetAt(2, 0) *
Dinv.GetAt(2, 1) *
R.GetAt(2, 0) -
R.GetAt(2, 2) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 1) +
R.GetAt(2, 2) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 0));
860 dRdF[0 * 9 + 8] = (-
R.GetAt(2, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 2) +
R.GetAt(2, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 1) +
R.GetAt(2, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 2) -
R.GetAt(2, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 1));
861 dRdF[1 * 9 + 8] = (
R.GetAt(2, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 2) -
R.GetAt(2, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(0, 0) -
R.GetAt(2, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 2) +
R.GetAt(2, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(0, 0));
862 dRdF[2 * 9 + 8] = (-
R.GetAt(2, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(0, 1) +
R.GetAt(2, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(0, 0) +
R.GetAt(2, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(0, 1) -
R.GetAt(2, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(0, 0));
863 dRdF[3 * 9 + 8] = (-
R.GetAt(2, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 2) +
R.GetAt(2, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 1) +
R.GetAt(2, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 2) -
R.GetAt(2, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 1));
864 dRdF[4 * 9 + 8] = (
R.GetAt(2, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 2) -
R.GetAt(2, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(1, 0) -
R.GetAt(2, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 2) +
R.GetAt(2, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(1, 0));
865 dRdF[5 * 9 + 8] = (-
R.GetAt(2, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(1, 1) +
R.GetAt(2, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(1, 0) +
R.GetAt(2, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(1, 1) -
R.GetAt(2, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(1, 0));
866 dRdF[6 * 9 + 8] = (-
R.GetAt(2, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 2) +
R.GetAt(2, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 1) +
R.GetAt(2, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 2) -
R.GetAt(2, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 1));
867 dRdF[7 * 9 + 8] = (
R.GetAt(2, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 2) -
R.GetAt(2, 0) *
Dinv.GetAt(1, 2) *
R.GetAt(2, 0) -
R.GetAt(2, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 2) +
R.GetAt(2, 1) *
Dinv.GetAt(0, 2) *
R.GetAt(2, 0));
868 dRdF[8 * 9 + 8] = (-
R.GetAt(2, 0) *
Dinv.GetAt(1, 0) *
R.GetAt(2, 1) +
R.GetAt(2, 0) *
Dinv.GetAt(1, 1) *
R.GetAt(2, 0) +
R.GetAt(2, 1) *
Dinv.GetAt(0, 0) *
R.GetAt(2, 1) -
R.GetAt(2, 1) *
Dinv.GetAt(0, 1) *
R.GetAt(2, 0));
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition ImplicitQRSVD.h:32
int rowk
Definition ImplicitQRSVD.h:35
GivensRotation< T > operator*(const GivensRotation< T > &A) const
Definition ImplicitQRSVD.h:165
GivensRotation(int rowi_in, int rowk_in)
Definition ImplicitQRSVD.h:41
int rowi
Definition ImplicitQRSVD.h:34
void ComputeUnconventional(const T a, const T b)
Definition ImplicitQRSVD.h:75
T s
Definition ImplicitQRSVD.h:37
void RowRotation(PMatrix< T, 2, 2 > &A) const
Definition ImplicitQRSVD.h:106
GivensRotation(T a, T b, int rowi_in, int rowk_in)
Definition ImplicitQRSVD.h:43
T c
Definition ImplicitQRSVD.h:36
void Fill(const PMatrix< T, 2, 2 > &R) const
Definition ImplicitQRSVD.h:89
void operator*=(const GivensRotation< T > &A)
Definition ImplicitQRSVD.h:155
GivensRotation()
Definition ImplicitQRSVD.h:39
~GivensRotation()
Definition ImplicitQRSVD.h:47
void ColumnRotation(PMatrix< T, 3, 3 > &A) const
Definition ImplicitQRSVD.h:143
void ColumnRotation(PMatrix< T, 2, 2 > &A) const
Definition ImplicitQRSVD.h:133
void RowRotation(PMatrix< T, 3, 3 > &A) const
Definition ImplicitQRSVD.h:116
void TransposeInPlace()
Definition ImplicitQRSVD.h:49
void Compute(const T a, const T b)
Definition ImplicitQRSVD.h:58
Definition SkeletalMeshComponent.h:307
void SingularValueDecomposition(const PMatrix< T, 2, 2 > &A, GivensRotation< T > &U, const TVector< T, 2 > &Sigma, GivensRotation< T > &V, const T tol=std::numeric_limits< T >::epsilon())
2x2 SVD (singular value decomposition) A=USV'
Definition ImplicitQRSVD.h:367
void dRdFCorotated(const PMatrix< T, 3, 3 > &F, TVector< T, 81 > &dRdF)
Definition ImplicitQRSVD.h:782
void MakeLambdaShape(PMatrix< T, 3, 3 > &H, PMatrix< T, 3, 3 > &U, PMatrix< T, 3, 3 > &V)
make a 3X3 matrix to lambda shape original form of H: x x x x x x x x x after : x 0 0 x x 0 x 0 x
Definition ImplicitQRSVD.h:263
void FlipSign(int i, PMatrix< T, 3, 3 > &U, TVector< T, 3 > &sigma)
Helper function of 3X3 SVD for flipping signs due to flipping signs of sigma.
Definition ImplicitQRSVD.h:494
void Sort0(PMatrix< T, 3, 3 > &U, TVector< T, 3 > &sigma, PMatrix< T, 3, 3 > &V)
Helper function of 3X3 SVD for sorting singular values.
Definition ImplicitQRSVD.h:512
void PolarDecomposition(const PMatrix< T, 2, 2 > &A, GivensRotation< T > &R, PMatrix< T, 2, 2 > &S_Sym)
2x2 polar decomposition.
Definition ImplicitQRSVD.h:323
void SwapCols(PMatrix< T, 3, 3 > &A, const int i1, const int i2)
Definition ImplicitQRSVD.h:501
FRealDouble FReal
Definition Real.h:22
void ZeroChase(PMatrix< T, 3, 3 > &H, PMatrix< T, 3, 3 > &U, PMatrix< T, 3, 3 > &V)
zero chasing the 3X3 matrix to bidiagonal form original form of H: x x 0 x x x 0 0 x after zero chase...
Definition ImplicitQRSVD.h:183
void MakeUpperBidiag(PMatrix< T, 3, 3 > &H, PMatrix< T, 3, 3 > &U, PMatrix< T, 3, 3 > &V)
make a 3X3 matrix to upper bidiagonal form original form of H: x x x x x x x x x after zero chase: x ...
Definition ImplicitQRSVD.h:235
T WilkinsonShift(const T a1, const T b1, const T a2)
Compute WilkinsonShift of the block a1 b1 b1 a2 based on the WilkinsonShift formula mu = c + d - sign...
Definition ImplicitQRSVD.h:454
void Sort1(PMatrix< T, 3, 3 > &U, TVector< T, 3 > &sigma, PMatrix< T, 3, 3 > &V)
Helper function of 3X3 SVD for Sorting singular values.
Definition ImplicitQRSVD.h:553
float v
Definition radaudio_mdct.cpp:62