2014-12-10 30 views
5

Đó là một nhiệm vụ khá đơn giản, nhưng tôi đã không thể tìm thấy câu trả lời cho nó:Nối cột ma trận, sử dụng Eigen thư viện

Sử dụng thư viện Eigen, giả sử tôi có Matrix2Xd matVector2d vec, nơi

mat = 1 1 1 
     1 1 1 
vec = 2 2 

Bây giờ tôi cần một cái gì đó giống như mat.addCol(vec) như rằng sau đó

mat = 1 1 1 2 
     1 1 1 2 

sự (đơn giản nhất) cách tốt nhất để thực hiện điều này là gì?

Xin lưu ý rằng đây không phải là bản sao của How do you make a matrix out of vectors in eigen?. Tôi không muốn khởi tạo cấu trúc ma trận nhưng thêm vào ma trận hiện có. Hoặc là có thể có một thủ thuật, làm thế nào để sử dụng khởi tạo dấu phẩy trong trường hợp này? Các mã sau đây sẽ thất bại:

Matrix2Xd mat(2,3); 
Vector2d vec; 
mat << 1, 1, 1, 1, 1, 1; 
vec << 2, 2; 

cout << mat << endl; 
mat << vec;    // <-- crashes here 
cout << mat << endl; 

Edit: các công trình sau đây, nhưng tôi không thích sự cần thiết của một biến tạm thời cho một nhiệm vụ cơ bản như vậy. Có cách nào tốt hơn?

Matrix2Xd tmp(2, mat.cols()+1); 
tmp << mat, vec; 
mat = tmp; 
+1

Bạn đã đọc những câu trả lời đầu tiên trong dupe: "Ma trận m mus đã been resized đúng đầu tiên."? Ma trận Eigen có chức năng thành viên ['resize'] (http://eigen.tuxfamily.org/dox/classEigen_1_1PlainObjectBase.html#afbbb33d14fe7fb9683019a39ce1c659d) ... Tài liệu có thể được googled hoặc đọc ít nhất. – rubenvb

+1

@rubenvb 'resize' không giữ nội dung của ma trận. Nếu tôi làm 'mat.resize (2, mat.cols() + 1);', ma trận được lấp đầy với một số giá trị ngẫu nhiên sau đó. – luator

+0

Sau đó, bạn sẽ cần phải tạo một tạm thời hoặc khởi tạo nó với kích thước chính xác. – rubenvb

Trả lời

9

Bạn có thể sử dụng cho mục đích đó conservativeResize:

mat.conservativeResize(mat.rows(), mat.cols()+1); 
mat.col(mat.cols()-1) = vec; 
+3

Cảm ơn, điều này đang hoạt động. Tôi đã tìm ra rằng thậm chí có thể viết 'mat.conservativeResize (NoChange, mat.cols() + 1);' cho phép số hàng không thay đổi. – luator

Các vấn đề liên quan