2013-04-27 33 views
6

Trong MATLAB, việc chia nhỏ các giá trị thỏa mãn một số điều kiện từ ma trận/mảng (gọi là logical indexing) là phổ biến.Eigen boolean array slicing

vec = [1 2 3 4 5]; 
condition = vec > 3; 
vec(condition) = 3; 

Làm cách nào để thực hiện điều này trong Eigen? Cho đến nay tôi có:

Eigen::Matrix<bool, 1, 5> condition = vec.array() > 3; 
+1

không có nhiều kinh nghiệm với Eigen, nhưng có vẻ như bạn đang tìm kiếm cho môi trường 'tính năng select' – Amro

+0

có thể trùng lặp của [Submatrices và các chỉ số sử dụng Eigen] (http: //stackoverflow.com/questions/13540147/submatrices-and-indices-using-eigen) –

Trả lời

0

Như đã chỉ ra trong câu trả lời cho một câu hỏi tương tự ở đây: Submatrices and indices using Eigen, libigl thêm chức năng này vào Eigen.

igl::slice(A,indices,B); 

là tương đương với

B = A(indices) 
+0

trong khi nó có thể hữu ích, nó không trả lời câu hỏi ở đây. OP yêu cầu tương đương với MATLAB của 'A (A> 3) = 3', không phải cách giải nén submatrix ... Giải pháp tôi đã trình bày về cơ bản là toán tử ternary yếu tố khôn ngoan tương đương với:' m (i) = (m (i)> 3)? 3: m (i) '. – Amro

+1

Duyệt tài liệu, ['igl :: slice_into'] (https://github.com/libigl/libigl/blob/master/include/igl/slice_into.cpp), là kết quả phù hợp hơn, nhưng theo như tôi có thể cho biết, nó chỉ hoạt động cho một danh sách các chỉ mục, không phải là một vectơ logic ... Ngay cả bảng chuyển đổi MATLAB-to-eigen/igl của chúng tôi gợi ý sử dụng ['Eigen :: select'] (http://eigen.tuxfamily.org /dox/classEigen_1_1Select.html): http://libigl.github.io/libigl/matlab-to-eigen.html (xem câu lệnh 'A (B == 0) = C (B == 0)'). – Amro

9

Hãy thử this:

#include <iostream> 
#include <Eigen/Dense> 

int main() 
{ 
    Eigen::MatrixXi m(1, 5); 
    m << 1, 2, 3, 4, 5; 
    m = (m.array() > 3).select(3, m); 
    std::cout << m << std::endl; 

    return 0; 
} 
+0

Giải pháp này không hoạt động !! – srsci

+0

@srsci: ý của bạn là gì? Ví dụ trên là làm việc tốt, nó thực tế thẳng ra khỏi tài liệu .. – Amro

+2

Thực tế, đối với vấn đề đã cho (tức là, giới hạn các giá trị) chỉ 'm.cwiseMin (3)' nên hoạt động (và thường nhanh hơn). – chtz