2016-09-09 13 views
5

ट्यूटोरियल उद्देश्यों के लिए, मैं मैट्रिक्स समीकरणों के परिणाम को चित्रित करने के लिए अक्सर मैट्रिक्स और वैक्टर को प्रिंट या प्रदर्शित करने में सक्षम होना चाहता हूं, जैसे $ ए x = b $।प्रिंटिंग मैट्रिस और वेक्टर साइड

मैं इस का उपयोग कर SAS/IML, जहां print बयान की (स्पेस द्वारा पृथक) भाव एक मनमाना संग्रह लेता है, उन्हें मूल्यांकन करता है और परिणाम प्रिंट, जैसे,

print A ' * ' x '=' (A * x) '=' b; 

        A      X #TEM1001  B 
        1  1 -4 * 0.733 =  2 =  2 
        1 -2  1  -0.33   1  1 
        1  1  1  -0.4   0  0 

ध्यान दें कि उद्धृत तार मुद्रित कर रहे हैं कर सकता है जैसा है।

मैंने खोज की है, लेकिन आर में ऐसा कुछ भी नहीं मिल सकता है। मुझे लगता है कि ऐसा कुछ ऐसा हो सकता है जैसे कि यह एक फ़ंक्शन showObj(object, ...) द्वारा किए गए तर्कों की सूची ले रहा है, प्रत्येक को वर्णों के ब्लॉक में स्वरूपित कर रहा है, और उन्हें साथ-साथ जुड़ना साइड।

इसका एक और उपयोग एक 3 डी सरणी को अपने स्लाइस के साइड-बाय-साइड संग्रह के रूप में प्रदर्शित करने का एक कॉम्पैक्ट तरीका होगा।

क्या यह घंटी बजती है या क्या किसी को शुरू करने के लिए कोई सुझाव है?

+1

मदद कर सकता है http://stackoverflow.com/questions/27513395/print-method-for-multiple-matrices – user20650

उत्तर

2

मैंने एक बहुत ही सरल फ़ंक्शन बनाया है जो मध्यस्थता वाले तार तारों (आमतौर पर ऑपरेटरों) के साथ मैट्रिस और वैक्टर मुद्रित कर सकता है। यह विभिन्न पंक्तियों के साथ matrices के लिए अनुमति देता है और वेक्टर matrices के रूप में वैक्टर व्यवहार करता है। यह बहुत विस्तृत नहीं है, इसलिए मुझे डर है कि ऐसे कई उदाहरण हैं जहां यह विफल रहता है। लेकिन आपके प्रश्न में एक के रूप में सरल उदाहरण के लिए, यह पर्याप्त होना चाहिए।

format() संख्याओं को वर्णों में बदलने के लिए उपयोग किया जाता है। इसका लाभ यह है कि मैट्रिक्स की सभी पंक्तियों की एक ही चौड़ाई है और मुद्रित होने पर इस प्रकार अच्छी तरह से गठबंधन किया जाता है। यदि आवश्यक हो, तो आप कॉन्फ़िगर करने योग्य बनाने के लिए के कुछ तर्क mat_op_print() के तर्कों के रूप में भी जोड़ सकते हैं। उदाहरण के तौर पर, मैंने तर्क width जोड़ा है जिसका उपयोग कॉलम की न्यूनतम चौड़ाई को नियंत्रित करने के लिए किया जा सकता है।

यदि फ़ंक्शन कॉल में मैट्रिस और वैक्टर नाम हैं, तो इन नामों को शीर्ष पंक्ति में शीर्षलेख के रूप में मुद्रित किया जाता है। अन्यथा, केवल संख्या मुद्रित की जाती है।

तो, यह समारोह है:

mat_op_print <- function(..., width = 0) { 

    # get arguments 
    args <- list(...) 
    chars <- sapply(args, is.character) 

    # auxilliary function to create character of n spaces 
    spaces <- function(n) paste(rep(" ", n), collapse = "") 

    # convert vectors to row matrix 
    vecs <- sapply(args, is.vector) 
    args[vecs & !chars] <- lapply(args[vecs & !chars], function(v) matrix(v, ncol = 1)) 

    # convert all non-characters to character with format 
    args[!chars] <- lapply(args[!chars], format, width = width) 

    # print names as the first line, if present 
    arg_names <- names(args) 
    if (!is.null(arg_names)) { 
    get_title <- function(x, name) { 
     if (is.matrix(x)) { 
     paste0(name, spaces(sum(nchar(x[1, ])) + ncol(x) - 1 - nchar(name))) 
     } else { 
     spaces(nchar(x)) 
     } 
    } 
    cat(mapply(get_title, args, arg_names), "\n") 
    } 

    # auxiliary function to create the lines 
    get_line <- function(x, n) { 
    if (is.matrix(x)) { 
     if (nrow(x) < n) { 
     spaces(sum(nchar(x[1, ])) + ncol(x) - 1) 
     } else { 
     paste(x[n, ], collapse = " ") 
     } 
    } else if (n == 1) { 
     x 
    } else { 
     spaces(nchar(x)) 
    } 
    } 

    # print as many lines as needed for the matrix with most rows 
    N <- max(sapply(args[!chars], nrow)) 
    for (n in 1:N) { 
    cat(sapply(args, get_line, n), "\n") 
    } 
} 

और यह कैसे काम करता है की एक उदाहरण है:

A = matrix(c(0.5, 1, 3, 0.75, 2.8, 4), nrow = 2) 
x = c(0.5, 3.7, 2.3) 
y = c(0.7, -1.2) 
b = A %*% x - y 
mat_op_print(A = A, " * ", x = x, " - ", y = y, " = ", b = b, width = 6) 
## A      x   y   b  
## 0.50 3.00 2.80 *  0.5 -  0.7 = 17.090 
## 1.00 0.75 4.00  3.7  -1.2  13.675 
##        2.3  

इसके अलावा एक 3-आयामी सरणी साइड-बाई-साइड की स्लाइस मुद्रण संभव है:

A <- array(1:12, dim = c(2, 2, 3)) 
mat_op_print(A1 = A[, , 1], " | ", A2 = A[, , 2], " | ", A3 = A[, , 3]) 
## A1  A2  A3  
## 1 3 | 5 7 | 9 11 
## 2 4  6 8  10 12 
+0

यह मुझे उस स्थान पर जाता है जहां मैं जाना चाहता हूं, लेकिन मैं यह नहीं देख सकता कि मैट्रिस के बीच अंतर को कैसे बढ़ाया जाए, अन्य तर्कों को जोड़कर और यह उन तर्कों के नाम भी प्रदर्शित करना अच्छा होगा जो कि उन तर्कों के नाम प्रदर्शित करना अच्छा होगा नाम हैं – user101089

+0

मैंने कॉलम की चौड़ाई को कॉन्फ़िगर करने योग्य बनाने और मैट्रिक्स नामों के साथ शीर्षक जोड़ने के लिए उत्तर बढ़ा दिया है। – Stibu

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