आर

2010-07-18 11 views
29

में मैट्रिक्स पावर आर में मैट्रिक्स की शक्ति की गणना करने की कोशिश कर रहा है, मैंने पाया कि पैकेज expm ऑपरेटर %^% लागू करता है।आर

तो x% ^% k मैट्रिक्स की के-वें शक्ति की गणना करता है।

> A<-matrix(c(1,3,0,2,8,4,1,1,1),nrow=3) 

> A %^% 5 
     [,1] [,2] [,3] 
[1,] 6469 18038 2929 
[2,] 21837 60902 9889 
[3,] 10440 29116 4729 

लेकिन, मेरे आश्चर्य:

> A 
    [,1] [,2] [,3] 
[1,] 691 1926 312 
[2,] 2331 6502 1056 
[3,] 1116 3108 505 

किसी भी तरह प्रारंभिक मैट्रिक्स A एक% ^% 4 में बदल गया है !!!

मैट्रिक्स पावर ऑपरेशन कैसे करते हैं?

उत्तर

25

मैंने आर-फोर्ज स्रोतों ("एक्सएमएम" पैकेज के) में उस बग को ठीक किया है, svn rev। 53. ->expm R-forge page किसी कारण वेब पेज अभी भी rev.52 से पता चलता के लिए, तो निम्नलिखित अभी तक आपकी समस्या का समाधान नहीं हो सकता है (लेकिन 24 चाहिए घंटों के भीतर):

install.packages("expm", repos="http://R-Forge.R-project.org") 

अन्यथा, SVN संस्करण प्राप्त सीधे, और अपने आप को स्थापित करें:

svn checkout svn://svn.r-forge.r-project.org/svnroot/expm 

"gd047" के लिए धन्यवाद जिन्होंने मुझे ई-मेल द्वारा समस्या के बारे में सतर्क किया। ध्यान दें कि आर-फोर्ज की अपनी बग ट्रैकिंग सुविधाएं भी हैं।
Martint

0

एक^= 5 (ए^4) * एक

मुझे लगता पुस्तकालय मूल चर mutates, ए, ताकि हर कदम मूल मैट्रिक्स के साथ परिणाम-अप-तक-तब गुणा शामिल है, ए। परिणाम जो आपको वापस मिलते हैं ठीक लगता है, बस उन्हें एक नए चर के लिए असाइन करें।

+0

गिना जा रहा है एक% ^% 6 भी एक के रूप में (प्रारंभिक ए छोड़ देता है)% ^% 4। परिणाम को एक नए चर में असाइन करना, मेरे प्रारंभिक मैट्रिक्स को बदलने से नहीं रोकता है। –

+0

आपके जैसा लगता है कि आपको मैट्रिक्स को पहले एक नए चर को असाइन करने का असामान्य चरण लेना होगा। – John

2

हालांकि स्रोत-कोड पैकेज में दिखाई दे रहा है क्योंकि यह एक .dll file में पैक किया जाता है नहीं है, मेरा मानना ​​है कि पैकेज के द्वारा प्रयोग किया एल्गोरिथ्म fast exponentiation algorithm, जो आप matpowfast बुलाया समारोह को देखकर अध्ययन कर सकते हैं बजाय है। ,

  • mat आदेश उत्पादन स्टोर करने के लिए में

    1. result, एक मध्यवर्ती चर के रूप में:

      आप दो चर की जरूरत है।

    A^6 गणना करने के लिए, के बाद से 6 = 110 (बाइनरी लेखन), अंत result = A^6 और mat = A^4 में,। यह A^5 के लिए समान है।

    आप mat = A^8 पर आसानी से जांच सकते हैं कि किसी भी 8<n<16 के लिए गणना करने का प्रयास करते हैं। यदि हां, तो आपके पास स्पष्टीकरण है।

    पैकेज फ़ंक्शन प्रारंभिक चर A इंटरमीडिएट चर mat के रूप में उपयोग करता है।

  • 8

    यह उचित उत्तर नहीं है, लेकिन यह चर्चा करने और आर के आंतरिक कार्यों को समझने के लिए एक अच्छी जगह हो सकती है। इस तरह की बग एक अन्य पैकेज में पहले से तैयार हो गई है जिसका उपयोग मैं कर रहा था।

    सबसे पहले, ध्यान दें कि बस एक नया चर करने के लिए मैट्रिक्स बताए पहले मदद नहीं करता है:

    > A <- B <-matrix(c(1,3,0,2,8,4,1,1,1),nrow=3) 
    > r1 <- A %^% 5 
    > A 
        [,1] [,2] [,3] 
    [1,] 691 1926 312 
    [2,] 2331 6502 1056 
    [3,] 1116 3108 505 
    > B 
        [,1] [,2] [,3] 
    [1,] 691 1926 312 
    [2,] 2331 6502 1056 
    [3,] 1116 3108 505 
    

    मेरा अनुमान है कि आर मूल्यों के बजाय संदर्भ द्वारा स्मार्ट गुजर बनने की कोशिश कर रहा है। वास्तव में इसे काम करने के लिए आपको बी से अलग करने के लिए कुछ करने की आवश्यकता है:

    `%m%` <- function(x, k) { 
        tmp <- x*1 
        res <- tmp%^%k 
        res 
    } 
    > B <-matrix(c(1,3,0,2,8,4,1,1,1),nrow=3) 
    > r2 <- B %m% 5 
    > B 
        [,1] [,2] [,3] 
    [1,] 1 2 1 
    [2,] 3 8 1 
    [3,] 0 4 1 
    

    ऐसा करने का स्पष्ट तरीका क्या है?

    अंत में, पैकेज के लिए सी कोड में, वहाँ इस टिप्पणी है:

    • एनबी: एक्स बदल दिया जाएगा!यदि आवश्यक हो तो कॉलर को प्रतिलिपि बनाना चाहिए

    लेकिन मुझे समझ में नहीं आ रहा है कि आर क्यों सी/फोरट्रान कोड वैश्विक वातावरण में साइड इफेक्ट्स देता है।

    +0

    इसका वैश्विक वातावरण में साइड इफेक्ट्स नहीं हैं - सी कोड आर ऑब्जेक्ट्स के संदर्भ में पारित किया गया है, इसलिए किसी ऑब्जेक्ट को जगह में संशोधित कर सकते हैं। यह कुछ अनुकूलन के लिए आवश्यक है, लेकिन आर उपयोगकर्ता के संपर्क में कभी नहीं होना चाहिए। – hadley

    +0

    @ हैडली मैं समझता हूं। लेकिन यदि दो वस्तुओं के लिए एक संदर्भ है (जैसा कि यह उपरोक्त मामला है, शायद दक्षता के लिए) और आप सी कोड को वस्तु को संशोधित करने देते हैं, तो आप (मुझे लगता है) वैश्विक पर्यावरण में साइड इफेक्ट्स हैं, सही? –

    +2

    आपकी व्याख्या मूल रूप से सही है, लेकिन आप उप-स्थानिक शब्दावली का उपयोग कर रहे हैं। वैश्विक पर्यावरण को संशोधित करने के बारे में बात करना समझ में नहीं आता है, क्योंकि वस्तु वैश्विक पर्यावरण में नहीं हो सकती है। – hadley

    2

    बहुत जल्दी समाधान किसी भी पैकेज का उपयोग किए बिना recursivity उपयोग कर रहा है: अगर आपके मैट्रिक्स एक

    powA = function(n) 
    { 
        if (n==1) return (a) 
        if (n==2) return (a%*%a) 
        if (n>2) return (a%*%powA(n-1)) 
    } 
    

    HTH

    +1

    यह बहुत उपयोगी नहीं है, क्योंकि मूल बग दो साल पहले तय किया गया था ... –

    +0

    प्लस यह बड़े घाटियों के लिए मैट्रिक्स एक्सपोनेंटिएशन करने का एक भयानक तरीका है – m09