5

これは非常にばかげた質問である可能性がありますが、ドキュメントでそれを探すのにかなりばかげた時間を費やしましたが、役に立ちませんでした。

MATLAB では、find() 関数によって、ゼロ以外の要素のインデックスを含む配列が得られます。Numpy の np.nonzero 関数も同様のことを行います。

C++ Eigen ライブラリでこれを行うにはどうすればよいですか? 私はブール配列を持っています

typedef <bool, 10, 1> foobar = MatrixA < MatrixB;

これまでのところ。ありがとう!

4

3 に答える 3

8

これがあなたの質問の一部であるかどうかはわかりませんが、適切な要素ごとの不等式の結果を構築するには、最初に行列を配列にキャストする必要があります。

MatrixXd A,B;
...
Matrix<bool,Dynamic,Dynamic> C = A.array()<B.array();

これでandと C(i,j) = A(i,j) < B(i,j)とC同じサイズになります。AB

真のエントリのすべてのインデックス (列優先順と仮定) を見つけるには、libigl の変換テーブルで説明されているように、このコンパクトな c++11 ルーチンを使用できます。

VectorXi I = VectorXi::LinSpaced(C.size(),0,C.size()-1);
I.conservativeResize(std::stable_partition(
  I.data(), I.data()+I.size(), [&C](int i){return C(i);})-I.data());

NowIC.nonZeros()長く、 の真のエントリのインデックスを含みますC。これらの 2 行は基本的に を実装してfindいます。

于 2015-02-02T15:33:46.347 に答える
2

Eigen に find() 関数があることを期待するのは合理的です。残念ながら、Eigen には、行列の演算子よりも少ない演算子がありません。幸いなことに、問題はそれほど難しくありません。これが問題の1つの解決策です。ベクトルを使用して、要素の列メジャー インデックス > 0 を格納しています。必要に応じて、VectorXf を使用できます。これを B - A で使用します (BA > 0 は B>A の評価と同じです)。stl for_each() 関数を使用しています。

#include<algorithm>
#include<vector>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;

class isGreater{
    public:
    vector<int>* GT;
    isGreater(vector<int> *g){GT = g;}
    void operator()(float i){static int it = 0; if(i>0)GT->push_back(it); it++;}
};
int main(int argc,char **argv){
    MatrixXf P = MatrixXf::Random(4,5);
    vector<int> GT;
    for_each(P.data(),P.data()+P.rows()*P.cols(),isGreater(&GT));
    cout<<P<<endl;
    for(int i=0;i<GT.size();++i)cout<<GT[i]<<" ";
    cout<<GT.size()<<endl;
    return 0;
}
于 2013-07-01T14:54:25.560 に答える
1

これは、あなたやこれをチェックしている他の人にとってはうまくいくかもしれません。別の行列 A の条件に基づいて行列 m の要素を設定するには、次の表記法を使用できます。

m = (A.array() != 0).select(1, m);

このコマンドは、行列 m の要素のうち、A に対応する要素が 0 でないものを 1 に置き換えます。

于 2016-01-29T18:03:14.353 に答える