Вы можете использовать вариант размещения PartialPivLU
- но похоже, что вы действительно хотите решить систему M*B = C
, для которой вам нужно просто разложить M
(так как она симметрична)вы можете использовать декомпозицию LLt
или LDLt
), а затем использовать метод декомпозиции solve
.
Для настройки M
вам также следует использовать метод diagonal
(не проверено):
MatrixXd M(n - 1, n - 1);
M.setZero();
M.diagonal().setConstant(n - 1.0);
M.diagonal<1>().setOnes();
M.diagonal<-1>().setOnes();
LLT<MatrixXd> lltOfM(M);
for (int i = 0; i < 3; ++i) { B[i] = lltOfM.solve(C[i]); }
Для больших n
это неоптимально, поскольку в нем не используется трехдиагональная структура M
. Вы можете попробовать модуль разреженности для этого, но на самом деле должен быть прямой алгоритм (хотя у Eigen явно нет трехдиагонального типа матрицы).
Для C
вы, вероятно, также можете использовать MatrixX3d
(Я не совсем понимаю, как вы заполняете свои C
векторы - я думаю, что ваш текущий код должен утверждаться во время выполнения, если только n==2
или вы не отключили утверждения).