5

Eigen::Matrix には、行列のすべての係数をランダムな値に設定する setRandom() メソッドがあります。ただし、使用する分布を指定しながら、すべての行列係数をランダムな値に設定する組み込みの方法はありますか。

次のようなものを達成する方法はありますか?

Eigen::Matrix3f myMatrix;
std::tr1::mt19937 gen;
std::tr1::uniform_int<int> dist(0,MT_MAX);
myMatrix.setRandom(dist(gen));
4

4 に答える 4

2

誰かがこのスレッドに出くわしている場合は、最近可能でブーストを必要としない簡単な回答を投稿しています。これは古い Eigen Bugzilla Reportで見つけました。次の簡単な方法を提案した著者 Gael Guennebaud の功績はすべて次のとおりです。

#include <Eigen/Sparse>
#include <iostream>
#include <random>

using namespace Eigen;

int main() {
  std::default_random_engine generator;
  std::poisson_distribution<int> distribution(4.1);
  auto poisson = [&] (int) {return distribution(generator);};

  RowVectorXi v = RowVectorXi::NullaryExpr(10, poisson );
  std::cout << v << "\n";
}

intこの例では使用されていませんが、Eigen NullaryExpr にはラムダ関数の引数を持つ署名が必要であることに注意してください。

于 2020-01-22T02:09:09.907 に答える
1

一様分布を除けば、マトリックスで直接使用できる他のタイプの分布については知りません。あなたができることは、Eigen が提供する一様分布をカスタム分布に直接マッピングすることです (マッピングが存在する場合)。

分布がシグモイドであるとします。関数 y = a / ( b + c exp(x) ) を使用して、一様分布をシグモイド分布にマッピングできます。

マトリックスを一時的に配列に変換することにより、マトリックスのすべての値に対して要素ごとに操作できます。

Matrix3f uniformM;
uniformM.setRandom();

Matrix3f sigmoidM;
sigmoidM.array() = a * ((0.5*uniformM+0.5).array().exp() * c + b).inv();
于 2013-03-28T14:27:28.467 に答える