2015-04-22 29 views
8

Ben bir matris (Weibull modelinin bilgi matrisi)matris çarpım - farklı değerler çıkış atanır

#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; 
} 

Şimdi Ar bazı değerler için matris hesaplamak istediğiniz hesaplamak için aşağıdaki fonksiyon yazdım :

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 

Bu matris iyi durumda. Şimdi, önce çıkışı atar ve sonra yazdırırsam, farklı bir matrisim olacaktır (bazı elemanlar bazı büyük değerlere dönüştürülecektir!).

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 

de görülebileceği , elemanlarının (1, 2), (1, 4), (2, 2) ve (3, 2) bir başka büyük değerler alır. Herhangi bir yardım için minnettarım. karşılık olarak

Update1 @Ronald için: R, versiyon 3.1.2 (2014-10-31)

  • Windows 7 x 64 version.string

    • platformu x86_64-w64-mingw32
    • Rcpp_0.11.3, RcppEigen_0.3.2.3.0, tools_3.1.2
    • Rtools sürüm 3.2.0.1948
  • +1

    Sistem bilgilerinizi sağlamalısınız. Bunu R 3.2.0'ı kullanarak bir Win7 sistemindeki en yeni paket sürümleri ile Rtools'un eski bir sürümüyle yeniden üretebilirim (sistem yöneticimizin güncellenmesi için ihtiyacım var). Bunu R 3.1.2 ve en yeni paket sürümleri ile bir linux sistemi üzerinde yeniden oluşturamıyorum. – Roland

    cevap

    9

    Toplamadan önce sıfırlarla Fisher_mat'u başlatmayı unutmuşsunuzdur, bu nedenle bazen rasgele önemsiz şeyler içerebilir. Ör. Bir for döngüsünden önce Fisher_mat.setZero(); döngü tutarlı bir çıktı verecektir.

    Bu referansı kontrol edin: RcppEigen Introduction.

    +0

    Önerdiğim satırı ekleyin ve sonuç her iki kez de doğru olacaktır (çok benzer bir kurulumda kontrol ettim). – tonytonov

    +0

    Teşekkürler, sonuç şimdi tutarlı. Ama eğer bunu ayarlamazsam Fisher_mat çok küçük sayıları (1.780215e-306 gibi) ve R 1.780215e-306 + .001 = .001 ve 1.780215e-306 - içerir. 001 = -.001. Tamam, hassas bir problem olduğunu varsayalım. Ama asıl sorum şu: (Weibull_FIM (x = c (1, 1.239, 1.749371, 5), w = rep (.25, 4), param = c (1, 1, 1, 2))) cevap ama bu bir değil (res <- Weibull_FIM (x = c (1, 1.239, 1.749371, 5), w = rep (.25, 4), param = c (1, 1, 1, 2))) cevabınız benim problemimi çözdü (bir yukarı) ama nedenini beklemeye devam ediyorum (hattınızı eklemeden önce). –

    +2

    @EhsanMasoudi Bu sayıları belirli koşullar altında içerebilir, ancak bu koşulların tekrar üretilebileceği garanti edilmez. Kesinlikle hassaslıkla ilgili değil. – Roland

    İlgili konular