Как примечание, неверно, что A.conservativeResize(4,4)
даст вам матрицу с добавленными строками, заполненными нулями. Документация Eigen гласит:
Если к матрице необходимо добавить значения, они будут неинициализированы.
Новые строки и столбцы будут заполнены мусором, и видеть нули - лишь совпадение (если вы не компилируете специальную директиву препроцессора для Eigen). Но это означает, что не тратится лишнее время на запись нулей, которые вы все равно перезапишете.
Примечание. Этот код демонстрирует, как получить матрицу с исходной матрицей в верхнем левом углу :
Лучший способ заполнить несколько значений одновременно - использовать операции блока Eigen и setConstant
. Например, если A
- это матрица размером old_size
x old_size
:
A.conservativeResize(n, n);
for (int i = 0; i < n; ++i) {
// Fill the end of each row and column
A.row(i).tail(n - old_size).setConstant(A(i, old_size - 1));
A.col(i).tail(n - old_size).setConstant(A(old_size - 1, i));
}
// Fill the bottom right block
A.bottomRightCorner(n - old_size, n - old_size).setConstant(A(old_size - 1, old_size - 1));
Более важно, чем быть "эффективным", эти функции выражают ваши намерения как программиста.
Редактировать: чтобы получить дополненную матрицу с исходной матрицей в середине :
Я только что заметил ваши примерные площадки вокруг исходной матрицы посередине, а не вверху слева. В этом случае нет смысла использовать conservativeResize()
, потому что исходные значения будут скопированы только в верхний левый угол. Схема решения:
- Создайте новую матрицу nxn
B
нужного размера
Скопируйте исходную матрицу в середину, используя
int start = (n - old_size + 1)/2;
B.block(start, start, old_size, old_size) = A;
Заполните внешние значения, используя операции блока, аналогичные моему примеру выше.