15 const int n = L.rows();
18 int blockSize =
static_cast<int>(n / 8);
19 blockSize = (blockSize / 16) * 16;
26 const int numBlocks =
static_cast<int>((n + blockSize - 1) / blockSize);
30 Eigen::MatrixXd L_inv = Eigen::MatrixXd::Identity(n, n);
33 for (
int i = 0; i < numBlocks; ++i) {
34 int i_start = i * blockSize;
35 int i_end =
std::min(i_start + blockSize, n);
36 int i_blockSize = i_end - i_start;
39 L.block(i_start, i_start, i_blockSize, i_blockSize)
40 .triangularView<Eigen::Lower>()
41 .solveInPlace(L_inv.block(i_start, i_start, i_blockSize, i_blockSize));
44 for (
int j = 0; j < i; ++j) {
45 int j_start = j * blockSize;
46 int j_end =
std::min(j_start + blockSize, n);
47 int j_blockSize = j_end - j_start;
50 Eigen::MatrixXd offDiagBlock = L.block(i_start, j_start, i_blockSize, j_blockSize) * L_inv.block(j_start, j_start, j_blockSize, j_blockSize)
51 .triangularView<Eigen::Lower>();
53 for (
int k = j + 1; k < i; ++k) {
54 int k_start = k * blockSize;
55 int k_end =
std::min(k_start + blockSize, n);
56 int k_blockSize = k_end - k_start;
59 offDiagBlock += L.block(i_start, k_start, i_blockSize, k_blockSize) * L_inv.block(k_start, j_start, k_blockSize, j_blockSize);
64 L_inv.block(i_start, j_start, i_blockSize, j_blockSize) = -L_inv.block(i_start, i_start, i_blockSize, i_blockSize) * offDiagBlock;