2012-06-13 40 views
4

Eigen :: Matrix有一個setRandom()方法,它將矩陣的所有係數設置爲隨機值。但是,是否有內置的方式將所有矩陣係數設置爲隨機值,同時指定要使用的分佈。根據任意分佈設置Eigen :: Matrix的係數

有沒有辦法實現類似以下內容:

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

回答

1

除了均勻分佈的,我不知道任何其他類型的分佈,可以直接用在一個矩陣。 您可以做的是將Eigen提供的統一分佈直接映射到您的自定義分佈(如果映射存在)。

假設你的分佈是一個sigmoid。 您可以使用函數y = a /(b + c exp(x))將均勻分佈映射到sigmoid分佈。

臨時converting your matrix to array可以操作的逐元素在你的矩陣的所有值:

Matrix3f uniformM; 
uniformM.setRandom(); 

Matrix3f sigmoidM; 
sigmoidM.array() = a * ((0.5*uniformM+0.5).array().exp() * c + b).inv(); 
3

你可以做你想要使用的是什麼升壓和unaryExpr。您傳遞給unaryExpr的函數需要接受一個您可以忽略的虛擬輸入。

#include <boost/random.hpp> 
#include <boost/random/normal_distribution.hpp> 
#include <iostream> 
#include <Eigen/Dense> 

using namespace std; 
using namespace boost; 
using namespace Eigen; 

double sample(double dummy) 
{ 
    static mt19937 rng; 
    static normal_distribution<> nd(3.0,1.0); 
    return nd(rng); 
} 

int main() 
{ 
    MatrixXd m =MatrixXd::Zero(2,3).unaryExpr(ptr_fun(sample)); 
    cout << m << endl; 
    return 0; 
}