2015-03-10 3 views
1

Используя библиотеку Eigen C++, у меня есть Matrix3f A, Vector4f b и Vector4f c. Я хочу создать Matrix4f M из них. Я хочу, чтобы верхний 3-к-3 угол M был A, я хочу, чтобы конечный столбец M был b, и я хочу, чтобы нижний ряд M был c.Eigen: конкатенирующие матрицы и векторы

Я знаю, как это сделать, просто создав Matrix4f и назначив каждый элемент по отдельности. Но есть ли более элегантное решение, которое поддерживает Eigen?

ответ

3

Считается ли это достаточно изящным?

#include <Eigen/Sparse> 
#include <iostream> 

using namespace Eigen; 
using std::cout; 
using std::endl; 

int main(int argc, char *argv[]) 
{ 

    Matrix4f m = Matrix4f::Random(); 
    Matrix3f A = Matrix3f::Constant(0.1); 
    Vector4f b = Vector4f::Constant(0.2), c = Vector4f::Constant(0.3); 
    cout << m << endl << endl; 
    cout << A << endl << endl; 
    cout << b << endl << endl; 
    cout << c << endl << endl; 

    m.block(0, 0, 3, 3) = A; 
    m.col(3) = b; 
    m.row(3) = c; 

    cout << m << endl << endl; 

    return 0; 
} 

Обратите внимание, что ваш вопрос вроде неоднозначным, как (3,3) положение будет определяться порядок присвоения между b и c.

+0

Элегантный достаточно для меня, спасибо! – Karnivaurus

+0

Что делать, если 'b' на самом деле является Vector3f? Можете ли вы по-прежнему назначать первые три элемента последнего столбца 'b', используя' m.col (3) = b', или 'b' должен быть Vector4f? – Karnivaurus

+0

@ Karnivaurus Нет, они должны быть одного размера. Вместо этого вы можете указать 'm.block (0,3,3,1) = b;'. –

Смежные вопросы