Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 生成随机矩阵时出现一些奇怪的情况(特征库)_C++_Matrix_Random_Eigen_Random Seed - Fatal编程技术网

C++ 生成随机矩阵时出现一些奇怪的情况(特征库)

C++ 生成随机矩阵时出现一些奇怪的情况(特征库),c++,matrix,random,eigen,random-seed,C++,Matrix,Random,Eigen,Random Seed,我的目的是在tmp中,将生成为orth(randn(lenghtDim,dimsSubsp(iK))”的矩阵堆叠起来(用Matlab表示法) 我模拟了这个过程的N次采样,每次我计算tmp的平方范数,并将其保存在normVal中。我尝试了不同的方法来生成这些随机矩阵,但它们的范数值总是相同的(使用Matlab我没有这种行为) 你能帮我理解这种奇怪的行为并解决它吗?多谢各位 Eigen::VectorXd EmpDistrLargSV(const std::size_t lenghtDim, con

我的目的是在tmp中,将生成为orth(randn(lenghtDim,dimsSubsp(iK))”的矩阵堆叠起来(用Matlab表示法) 我模拟了这个过程的N次采样,每次我计算tmp的平方范数,并将其保存在normVal中。我尝试了不同的方法来生成这些随机矩阵,但它们的范数值总是相同的(使用Matlab我没有这种行为)

你能帮我理解这种奇怪的行为并解决它吗?多谢各位

Eigen::VectorXd EmpDistrLargSV(const std::size_t lenghtDim, const std::vector<std::size_t>& dimsSubsp, int nresample ){

 Eigen::VectorXd normVal;
 Eigen::MatrixXd tmp(std::accumulate(dimsSubsp.cbegin(),dimsSubsp.cend(),0),lenghtDim);
 normVal.resize(nresample);
 std::normal_distribution<double> distribution(0,1);
 std::default_random_engine engine (nresample );
    for (int i = 0; i <nresample ; ++i) {
        for (int iK = 0; iK < dimsSubsp.size(); ++iK) {
            std::size_t row_start=std::accumulate(dimsSubsp.begin(),dimsSubsp.begin()+iK,0);
            Eigen::MatrixXd myRandMat = Eigen::MatrixXd::NullaryExpr(lenghtDim,dimsSubsp[iK],[&](){return distribution(engine);});
            Eigen::JacobiSVD<Eigen::MatrixXd> svd(myRandMat, Eigen::ComputeThinU );
            tmp.block(row_start,0,dimsSubsp[iK],lenghtDim)=svd.matrixU().transpose();

        }
        normVal(i)=tmp.squaredNorm();
    }
    return normVal;
}

为了获得<代码>()(代码)>,C++中,我计算SVD,然后取MatRIXU。< /P> < P>根据它的故障构造程序创建简单的增量和模,从某个种子开始。 因此,您使用的随机引擎是确定性的

这就是为什么得到相同的矩阵和相同的范数。Matlab可能是不确定的。

编辑:

哈哈,我知道现在是什么了。您正在执行SVD并查看
U
,它始终(无论输入如何)是一个酉矩阵。酉矩阵的性质是
U^T*U==I
,这意味着其每列的范数(和平方范数)正好是1。因此,矩阵的平方范数将等于列数(在“瘦”
U
的情况下,行或列的最小值),而不管使用什么随机数生成器

以下不相关信息:

请尝试
std::mt19937
,而不是
std::default\u random\u engine
。我不确定使用
nSample
作为您的种子是否重要,但您可能希望尝试使用类似
std::chrono::high_resolution\u clock::now().time\u since\u epoch().count()
。否则,我认为你的方法与我的类似

#include <chrono>
#include <random> 
#include <Eigen/eigen>

MatrixX<double> random_matrix(int rows, int cols, double min, double max, unsigned seed)
{
   std::mt19937 generator(seed);
   std::uniform_real_distribution<double> distribution(min,max);
   MatrixX<double> result(rows,cols);
   for(double& val : result.reshaped())
      val = distribution(generator);
   return result;
}

MatrixX<double> rando = random_matrix(20, 34, -30.1, 122.3, std::chrono::high_resolution_clock::now().time_since_epoch().count());
#包括
#包括
#包括
MatrixX随机矩阵(整数行、整数列、双最小值、双最大值、无符号种子)
{
std::mt19937发电机(种子);
标准:均匀实分布(最小值、最大值);
MatrixX结果(行、列);
for(double&val:result.reformed())
val=配电(发电机);
返回结果;
}
MatrixX rando=随机矩阵(20,34,-30.1,122.3,标准::时钟::高分辨率时钟::现在().自新纪元以来的时间().count());

如何解决此问题?你有什么建议吗?在文档中被认为是不确定的。试着用它来代替std::default_random_engine我尝试了你给我的建议,但在两件事上我仍然得到了相同的结果:1。您正在使用每个函数调用构造一个新的随机引擎,这意味着它将像以前一样被播种,并将产生相同的伪随机数序列。始终在外部构建您的随机引擎,并为其播种一个。2.以上并不是代码始终生成相同值的唯一原因。事实上,修复随机数生成不会改变任何事情。你没有编程,只有一个数学错误。我故意这么做,把随机引擎放在函数里面。我不明白的是,为什么在外部循环的每次迭代中,normVal总是相同的数字。我试着打印tmp,在每次迭代中都会看到一个不同的矩阵,但它的范数总是一样的。。我在MATLAB代码中添加了我试图在C++中“翻译”的代码
#include <chrono>
#include <random> 
#include <Eigen/eigen>

MatrixX<double> random_matrix(int rows, int cols, double min, double max, unsigned seed)
{
   std::mt19937 generator(seed);
   std::uniform_real_distribution<double> distribution(min,max);
   MatrixX<double> result(rows,cols);
   for(double& val : result.reshaped())
      val = distribution(generator);
   return result;
}

MatrixX<double> rando = random_matrix(20, 34, -30.1, 122.3, std::chrono::high_resolution_clock::now().time_since_epoch().count());