2015-04-22 7 views
8

मैं एक मैट्रिक्स (वेइबुल मॉडल की जानकारी मैट्रिक्स)आव्यूह गुणन - विभिन्न मूल्यों जब उत्पादन असाइन किया गया है

#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 

के रूप में देखा जा सकता है, तत्वों (1, 2), (1, 4), (2, 2) और (3, 2) एक और बड़ी मूल्यों को प्राप्त। मैं किसी भी मदद की सराहना करता हूं।

जवाब में Update1 @Ronald रहे हैं:

  • आर संस्करण 3.1.2 (2014-10-31)
  • विंडोज 7 x64 version.string
  • मंच x86_64-W64-mingw32
  • Rcpp_0.11.3, RcppEigen_0.3.2.3.0, tools_3.1.2
  • Rtools संस्करण 3.2.0.1948
+1

आपको अपनी सिस्टम जानकारी प्रदान करनी चाहिए। मैं Rtools के पुराने संस्करण के साथ Win7 सिस्टम पर नवीनतम पैकेज संस्करणों के साथ आर 3.2.0 का उपयोग करके इसे पुन: उत्पन्न कर सकता हूं (मुझे अपडेट करने के लिए हमारे सिस्टम व्यवस्थापक की आवश्यकता है)। मैं इसे आर 3.1.2 और नवीनतम पैकेज संस्करणों के साथ लिनक्स सिस्टम पर पुन: पेश नहीं कर सकता। – Roland

उत्तर

9

आप समीकरण से पहले शून्य के साथ Fisher_mat प्रारंभ करना भूल गए हैं, इसलिए कभी-कभी इसमें यादृच्छिक जंक हो सकता है। उदाहरण जोड़ना Fisher_mat.setZero();for लूप से पहले आपको लगातार आउटपुट मिलेगा।

इस संदर्भ को देखें: RcppEigen Introduction

+0

मैं जो लाइन प्रस्तावित करता हूं उसे जोड़ें और परिणाम दोनों बार सही होगा (मैंने इसे बहुत ही समान सेटअप पर चेक किया है)। – tonytonov

+0

धन्यवाद, परिणाम अब सुसंगत है। लेकिन अगर मैं इसे सेट नहीं करता तो फिशर_मैट में बहुत छोटी संख्याएं होती हैं (जैसे 1.780215e-306) और आर 1.780215e-306 + .001 = .001 और 1.780215e-306 - में। 001 = -.001। ठीक है मान लीजिए कि सटीक समस्या थी। लेकिन मेरा मुख्य सवाल यह है कि क्यों (Weibull_FIM (x = c (1, 1.239, 1.749371, 5), w = rep (.25, 4), param = c (1, 1, 1, 2))) मुझे सही देता है उत्तर दें लेकिन यह एक नहीं है (res <- Weibull_FIM (x = c (1, 1.239, 1.749371, 5), w = rep (.25, 4), param = c (1, 1, 1, 2)) आपकी प्रतिक्रिया ने मेरी समस्या हल की (एक ऊपर) लेकिन मैं कारण के लिए इंतजार कर रहा हूं (अपनी लाइन जोड़ने से पहले)। –

+2

@ एहसान मसूदी इसमें इन परिस्थितियों को विशिष्ट परिस्थितियों में शामिल किया जा सकता है, लेकिन इन परिस्थितियों को प्रतिलिपि बनाने की गारंटी नहीं है। यह निश्चित रूप से परिशुद्धता से संबंधित नहीं है। – Roland

संबंधित मुद्दे