2017-06-06 5 views
1

Eigenでは、2つの配列をコンポーネントごとに比較できます。 broadcastingを使用して、適切なサイズのベクトルを行列に追加することもできます。しかし、これらの2つは、行/列ごとの比較操作を可能にする明らかな方法で結合しません。たとえば、固有ブロードキャスト比較

#include <iostream> 
#include <Eigen/Core> 

using namespace std; 
using namespace Eigen; 

using vect_t = Matrix<double, 1, 3>; 
using matr_t = Matrix<double, 5, 3>; 

int main() 
{ 
    vect_t l(0.1,0.1,0.1); 
    vect_t u(0.3,0.3,0.3); 
    matr_t X; 
    X << 0.0, 0.0, 0.0, 
     0.1, 0.2, 0.1, 
     0.2, 0.2, 0.2, 
     1.0, 0.0, 0.2, 
     0.2, 0.4, 0.4; 

    auto Y = l.array() < u.array(); // okay, gives [1, 1, 1] 
    auto Z = X.array().rowwise() + l.array(); 
    // okay, gives 
    // 0.1, 0.1, 0.1, 
    // 0.2, 0.3, 0.2, 
    // 0.3, 0.3, 0.3, 
    // 1.1, 0.1, 0.3, 
    // 0.3, 0.5, 0.5; 

    //auto W = X.array().rowwise() < l.array(); // does not compile 
    // would expect (via broadcasting) something like 
    // 1, 1, 1, 
    // 0, 0, 0, 
    // 0, 0, 0, 
    // 0, 1, 0, 
    // 0, 0, 0 

    cout << X << endl << endl; 
    cout << Y << endl << endl; 
    cout << Z << endl << endl; 
    //cout << W << endl << endl; 

    return 0; 
} 

このような行比較はどのように実現できますか?

コメント:これはうまく動作するはずです。それはまだ実装されていないか、何か不足していますか?

答えて

2

rowwise()またはcolwise()が機能しない場合は、replicateを使用できます。あなたのケースでは:

auto W = X.array() < l.array().replicate(X.rows(), 1); 

または

auto W = X.array() < l.array().colwise().replicate(X.rows()); 
+0

おかげで再び@chtz。他の方法ではなく、このようにパフォーマンスを考慮する必要がありますか? – Dan

+0

最適化でコンパイルすると 'replicate'構文は' colwise'/'rowwise'変種(両方が可能な場合)と同じコードになります。違いをどこかに通知すると、バグと見なされます。 – chtz

関連する問題