В любом случае это невозможно сделать на месте, поэтому просто создайте новую (достаточно большую) матрицу, скопируйте исходную матрицу в большую матрицу и переместите / поменяйте местами матрицы. Пример реализации (может быть обобщен для LeftDown / RightUp / ... - также эта реализация предполагает, что up
и left
неотрицательны):
template<class Derived>
void resizeUpLeft(Eigen::DenseBase<Derived>& mat, Eigen::Index up, Eigen::Index left)
{
typename Derived::PlainObject biggerMat(mat.rows()+up, mat.cols()+left);
// Note: biggerMat will be filled with uninitialized values,
// use setZero, if that is not desired
// if allocation of biggerMat fails mat stays unchanged
biggerMat.bottomRightCorner(mat.rows(), mat.cols()) = mat;
// move or swap to avoid copy:
mat.derived() = std::move(biggerMat);
// with C++03:
// mat.derived().swap(biggerMat);
}