UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Tridiagonal.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6
7namespace UE {
8namespace Geometry {
9
10/*
11 * Solver for linear systems for tridiagonal matrices of the form
12 *
13 * [ B0 C0 0 0 ... 0 ]
14 * [ A1 B1 C1 0 ... 0 ]
15 * [ 0 A2 B2 C2 ... 0 ]
16 * [ 0 0 A3 B3 ... 0 ]
17 * [ . . . . . Cn-2 ]
18 * [ 0 0 0 0 ... Bn-1 ]
19 *
20 * using Thomas algorithm.
21 */
22template <typename T>
24{
25public:
26
28 : A(InA)
29 , B(InB)
30 , C(InC)
31 , N(A.Num())
32 {
33 check(B.Num() == N);
34 check(C.Num() == N);
35 D.SetNum(N-1);
36 Prepare();
37 }
38
39 /*
40 * Solve linear system A * X = Rhs
41 *
42 * Note that Rhs is modified.
43 */
45 {
46 if (!bInvertible)
47 {
48 return false;
49 }
50
51 Rhs[0] /= B[0];
52 for (size_t I=1; I<N; ++I)
53 {
54 const T Divisor = B[I] - A[I] * D[I-1];
55 if (FMath::Abs(Divisor) < T(UE_SMALL_NUMBER))
56 {
57 return false;
58 }
59 Rhs[I] = (Rhs[I] - A[I] * Rhs[I-1]) / Divisor;
60 }
61
62 X[N-1] = Rhs[N-1];
63 for (size_t I=N-2; ; --I)
64 {
65 X[I] = Rhs[I] - D[I] * X[I+1];
66 if (I==0)
67 {
68 break;
69 }
70 }
71 return true;
72 }
73
74private:
75
76 void Prepare()
77 {
78 bInvertible = false;
79 if (FMath::Abs(B[0]) < T(UE_SMALL_NUMBER))
80 {
81 return;
82 }
83
84 D[0] = C[0] / B[0];
85 for (size_t I=1; I<N-1; ++I)
86 {
87 const T Divisor = B[I] - A[I] * D[I-1];
88 if (FMath::Abs(Divisor) < T(UE_SMALL_NUMBER))
89 {
90 return;
91 }
92 D[I] = C[I] / Divisor;
93 }
94 bInvertible = true;
95 }
96
97 const TArray<T>& A, B, C; // matrix representation
98 TArray<T> D; // forward pass temporary
99 const size_t N;
100 bool bInvertible;
101};
102
103} // end namespace Geometry
104} // end namespace UE
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define X(Name, Desc)
Definition FormatStringSan.h:47
@ Num
Definition MetalRHIPrivate.h:234
#define UE_SMALL_NUMBER
Definition UnrealMathUtility.h:130
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
Definition Tridiagonal.h:24
bool Solve(TArray< T > &Rhs, TArray< T > &X)
Definition Tridiagonal.h:44
TTridiagonalSolver(const TArray< T > &InA, const TArray< T > &InB, const TArray< T > &InC)
Definition Tridiagonal.h:27
Definition AdvancedWidgetsModule.cpp:13