компонентно-условные / кусочно-определенные операции в собственных - PullRequest
2 голосов
/ 16 января 2012

Есть ли способ реализовать с использованием собственного что-то вроде (псевдокод):

A = BooleanExpr(X) ? ExprTrue : ExprFalse;

где все переменные являются Eigen :: Array's. То есть для каждого компонента X, если BooleanExpr для этого компонента имеет значение true, соответствующий компонент A вычисляется как ExprTrue, в противном случае это ExprFalse.

Я реализую это в данный момент как:

COND = BooleanExpr(X).cast<double>();
A = COND * ExprTrue + (1-COND) * ExprFalse;

Но это вычисляет оба Expr * для каждого компонента, что не очень хорошо, когда Expr стоят дорого.

На самом деле я хотел бы обобщить это на кусочно-определенную функцию X, чтобы я мог вычислить что-то вроде (псевдокод):

A = PieceExpr[ IntExpr(X) ] ( B );

, который является результатом целочисленного выражения для компонента X, определяет выражение, используемое для вычисления соответствующего компонента A.

Может быть, я просто ошибаюсь, и есть способ достичь того же результата в eigen, я просто не могу понять это.

1 Ответ

2 голосов
/ 16 января 2012

Похоже, вам нужен .select (), как описано в http://eigen.tuxfamily.org/dox-devel/classEigen_1_1DenseBase.html#a7c7f8804e216885f49b70f61c7ae3bbb (я думаю, что это работает с массивами и матрицами, в отличие от того, что предлагается в документации).

Для более общей ситуации я не знаю хорошего способа добиться этого, кроме вложенных выборок.

...