मैंने एक बहुत ही सरल फ़ंक्शन बनाया है जो मध्यस्थता वाले तार तारों (आमतौर पर ऑपरेटरों) के साथ मैट्रिस और वैक्टर मुद्रित कर सकता है। यह विभिन्न पंक्तियों के साथ 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
मदद कर सकता है http://stackoverflow.com/questions/27513395/print-method-for-multiple-matrices – user20650