2012-01-16 2 views
2

есть способ реализовать, используя собственные векторы что-то вроде (псевдокод):покомпонентной условные/кусочно-определенные операции по собственным

A = BooleanExpr(X) ? ExprTrue : ExprFalse; 

, где все переменные являются Эйген :: массива. Это для каждого компонента X, если BooleanExpr на этом компоненте истинно, соответствующий компонент A вычисляется как ExprTrue, иначе это ExprFalse.

я реализую его в тот момент, как:

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

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

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

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

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

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

ответ

2

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

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

+0

правый! спасибо ... – artm

+0

также, насколько я понимаю, вопреки тем, какие аргументы указывают, что thenMatrix и elseMatrix могут быть выражениями, и только один или другой будет вычисляться на один компонент (поскольку типы аргументов DenseBase, а не MatrixBase). – artm

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