2012-11-25 77 views
5

Tôi đang cố gắng trả lại một khối ma trận làm giá trị của hàm. Hãy nói rằng chức năng của tôi trông như thế này:Thư viện Eigen: trả về một khối ma trận trong một hàm như lvalue

Block<Derived> getBlock(MatrixXd & m, int i, int j, int row, int column) 
{ 
    return m.block(i,j,row,column); 
} 

Khi nó quay ra, có vẻ như C++ biên dịch hiểu rằng nhà điều hành khối() cho phép chỉ có giá trị tạm thời và do đó trở về nó như là một giá trị trái bị cấm bởi trình biên dịch. Tuy nhiên, trong tài liệu Eigen có một số ví dụ rằng chúng ta có thể sử dụng Eigen như một lvalue (http://eigen.tuxfamily.org/dox/TutorialBlockOperations.html#TutorialBlockOperationsUsing) vì vậy tôi tự hỏi làm thế nào chúng ta không thể làm điều tương tự với hàm trở về.

a.block(0,0,2,3) = a.block(2,1,2,3); 

Cảm ơn bạn!

Trả lời

6

tôi muốn đưa những gì tôi tìm thấy bản thân mình vì vậy nó có thể hữu ích cho người khác:

giải pháp cơ bản của tôi là phải biết những gì có nguồn gốc gõ bạn muốn chặn được. Trong trường hợp này:

Block<MatrixXd> getBlock(MatrixXd & m, int i, int j, int row, int column) 
{ 
    return m.block(i,j,row,column); 
} 

Thật thú vị khi nhận thấy phương pháp này sẽ trả về tham chiếu đến nội dung ma trận m theo mặc định. Vì vậy, nếu chúng tôi làm:

MatrixXd m = MatrixXd::Zero(10,10); 
Block<MatrixXd> myBlock = getBlock(m, 1, 1, 3, 3); 
myBlock << 1, 0, 0, 
      0, 1, 0, 
      0, 0, 1; 

Nội dung trong ma trận m cũng sẽ được sửa đổi. Lưu ý rằng, tuy nhiên,

MatrixXd m = MatrixXd::Zero(10,10); 
MatrixXd myBlock = getBlock(m, 1, 1, 3, 3); 
myBlock << 1, 0, 0, 
      0, 1, 0, 
      0, 0, 1; 

sẽ không hoạt động. Sự hiểu biết của tôi là khi chúng tôi chuyển đổi khối sang loại khác, Eigen tạo một bản sao của dữ liệu trước khi chuyển đổi.

+0

nhờ các mẫu biểu thức, khối() không thực sự trả về bản sao khối, thay vào đó nó chỉ trả về một biểu thức –

+0

@ user3183610 để làm thế nào để buộc một khối (biểu thức) để đánh giá. Tôi có nghĩa là một giá trị hợp lệ. – stanleyerror

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