与Rcpp的矩阵乘法-分配输出时的不同值

与Rcpp的矩阵乘法-分配输出时的不同值,r,matrix,rcpp,R,Matrix,Rcpp,我编写了以下函数来计算矩阵(威布尔模型的信息矩阵) 这个矩阵很好。现在,如果我首先分配输出,然后打印它,我将有一个不同的矩阵(一些元素将更改为一些大值!) res您忘记在求和之前用零初始化Fisher_mat,因此它有时可能包含随机垃圾。添加例如Fisher_mat.setZero()将为您提供一致的输出 检查此参考:。您应该提供您的系统信息。我可以使用R3.2.0和最新的软件包版本,在Win7系统上使用较旧版本的Rtools(我需要我们的系统管理员进行更新)来重现这一点。我无法在具有R3.1.

我编写了以下函数来计算矩阵(威布尔模型的信息矩阵)

这个矩阵很好。现在,如果我首先分配输出,然后打印它,我将有一个不同的矩阵(一些元素将更改为一些大值!)


res您忘记在求和之前用零初始化
Fisher_mat
,因此它有时可能包含随机垃圾。添加例如
Fisher_mat.setZero()for
循环之前,code>将为您提供一致的输出


检查此参考:。

您应该提供您的系统信息。我可以使用R3.2.0和最新的软件包版本,在Win7系统上使用较旧版本的Rtools(我需要我们的系统管理员进行更新)来重现这一点。我无法在具有R3.1.2和最新软件包版本的linux系统上复制这些数据。@EhsanMasoudi在特定情况下,它可能包含这些数字,但不能保证这些情况是可复制的。这当然与精度无关。@Roland是绝对正确的。在这种情况下,
Fisher_mat
的初始化只是分配内存,并不能保证所有条目都像您可能期望的那样为零。你得到的正是“随机垃圾”。@Ronald和tonytonov你是对的。我没有将Fisher_mat设置为零,因为我认为它与Rcpp中的NumericMatrix具有相同的行为4行5列的矩阵(用0填充)数值矩阵xx(4,5);但它没有。不,我们明确地将内存设置为零,仍然认为它是正确的(和安全的)默认值。这就是我所说的。Rcpp将元素设置为零,RcppEigen不设置,因为Eigen不设置。
#include <RcppEigen.h>
#include <math.h>
#include <vector>
using namespace std;

using Eigen::MatrixXd;                  

// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::export]]

MatrixXd Weibull_FIM(const vector<double> x, const vector<double> w, const vector<double> param)
{
  if(x.size() != w.size()){
    Rcpp::Rcout<<"The length of x and w is not equal."<<std::endl;
    exit(1);
  }
  double  a, b, lambda, h, constant;
  a = param[0];
  b = param[1];
  lambda = param[2];
  h = param[3];

  a = a + 0; //just to not get a warning 

  Eigen::MatrixXd Fisher_mat(4, 4);  
  size_t i;

  for(i=0; i < x.size(); i++)
  { 
    constant = exp(-lambda * pow(x[i], h));
    Eigen::MatrixXd f(4, 1);
    f(0, 0) = 1;
    f(1, 0) = -constant;
    f(2, 0) = b*pow(x[i], h)*constant;
    f(3, 0) = b*pow(x[i], h)*constant * lambda * log(x[i]);

    Fisher_mat = w[i] * f * f.transpose() + Fisher_mat;
  }

  return Fisher_mat;
}
 Weibull_FIM(x=c(1, 1.239, 1.749371, 5), w = rep(.25, 4), param=c(1, 1, 1, 2))

#            [,1]         [,2]         [,3]         [,4]
#[1,]  1.00000000 -0.157545687  0.210509365  0.037774174
#[2,] -0.15754569  0.045985587 -0.053326010 -0.004757122
#[3,]  0.21050936 -0.053326010  0.066320481  0.008736574
#[4,]  0.03777417 -0.004757122  0.008736574  0.002864707
res <- Weibull_FIM(x=c(1, 1.239, 1.749371, 5), w = rep(.25, 4), param=c(1, 1, 1, 2))
print(res)
#           [,1]           [,2]         [,3]           [,4]
#[1,]  1.00000000  4.727161e+180  0.210509365  2.267126e+161
#[2,] -0.15754569  5.104678e+199 -0.053326010  -4.757122e-03
#[3,]  0.21050936   2.079498e+64  0.066320481   8.736574e-03
#[4,]  0.03777417  -4.757122e-03  0.008736574   2.864707e-03