2016-10-18 15 views
0

固有値に+、 - などのようなコンポーネントバイナリ演算子があります。また、2つのクラス関数cwiseMinおよびcwiseMaxもありますが、 、少なくとも、AbsDiff | xi-yi | ans SqrDiff(xi - yi)^ 2。しかし、それを行う方法?固有値でバイナリ演算(または関数)を拡張する方法

私が考えることができる唯一のことは、2つのデータポインタを取得して(おそらく、cilkを使用して)動作させることですが、ハックのように見えます。私はAbsDiff(x、y)= | x-y |のようなスカラー関数を定義する可能性を期待していました。 SqrDiff(x、y)=(x-y)^ 2を生成し、それらを一般的な固有トラバーサルルーチンに渡すが、明らかに存在しない。私は何かが不足していますか?

+0

'(x-y).cwiseAbs()'または '(x-y).cwiseAbs2()'の記述に間違いはありますか? – chtz

答えて

3

あなたはfuncバイナリファンクタである

result = x.binaryExpr(y, func); 

を書くことができます。私はあなたのユースケースのために、上記に書いたようしかし、単にこれらの式は遅延評価されます

absdiff = (x-y).cwiseAbs(); 
sqrdiff = (x-y).cwiseAbs2(); 

を書くことと、(利用可能な場合)ベクトル化の恩恵を受ける良いはずです。

+0

お寄せいただきありがとうございます。 binaryExprについて、私は、una​​ryExprの場合、正しいシグニチャを渡すだけで、double型の配列(もちろん、expやsinなど)のようなstdライブラリ関数さえも渡すことができることを知っています。関数double(double、double)に対して同じことが可能だと思いますか? –

+0

ファンクション 'double f(double、double)'を持っているなら、ファンクタとして 'std :: ptr_fun(f)'を渡すだけで動作します。 – chtz

+1

補足として、C++ラムダをunaryExprとbinaryExprの両方に渡すこともできます。 – ggael

関連する問題