2016-09-09 42 views
5

Öğretici amaçlı olarak, matris denkleminin sonucunu göstermek için matrisleri ve vektörleri yan yana yazabilir veya görüntüleyebilirim, örneğin $ A x = b $.yazdırma matrisleri ve vektörler yan yana

Ben print açıklamada, ifadeler (boşlukla ayrılmış) rastgele bir koleksiyonunu alır bunları değerlendirir ve sonucu yazdırır bu kullanarak SAS/IML, örneğin dizeleri basılır alıntı

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 

Not yapabilirdi olduğu gibi.

Aramıştım ama R'de böyle bir şey bulamadım. Bunun gibi bir şey, bir argüman listesi alarak, her birini bir karakter bloğuna biçimlendiren ve yan yana birleştiren bir işlevle showObj(object, ...) yapılabileceğini hayal ediyorum. -yan.

Bunun bir başka kullanımı, bir 3B dizisini dilimlerinin yan yana toplanması olarak göstermenin kompakt bir yolu olacaktır.

Bu, bir zil çaldırır mı, yoksa herkesin başlaması için bir öneri var mı?

+1

yardımcı olabilecek http://stackoverflow.com/questions/27513395/print-method-for-multiple-matrices – user20650

cevap

2

Matrisleri ve vektörleri aralarında rasgele karakter dizeleri (genellikle işleçler) ile basabilen çok basit bir işlev oluşturdum. Farklı sayıda satır içeren matrislere izin verir ve vektörleri sütun matrisleri olarak ele alır. Çok ayrıntılı değil, bu yüzden başarısız olduğu birçok örnek var. Ama sorunuzdaki kadar basit bir örnek için, bu yeterli olmalı. Sayıları karakterlere dönüştürmek için

format() kullanılır. Bu, matrisin tüm sıralarının aynı genişliğe sahip olması ve böylece basıldığında güzel bir şekilde hizalanması avantajına sahiptir. Gerekirse, yapılandırılabilir yapmak için format() argümanlarının bir kısmını mat_op_print() argümanları olarak da ekleyebilirsiniz. Örnek olarak, sütunların minimum genişliğini kontrol etmek için kullanılabilecek width argümanını ekledim.

Matrisler ve vektörler işlev çağrısında adlarsa, bu adlar ilk satırda başlıklar olarak yazdırılır. Aksi takdirde sadece sayılar yazdırılır.

Yani, bu işlevi:

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") 
    } 
} 

Ve bu nasıl çalıştığını bir örnek:

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  

Ayrıca 3 boyutlu bir dizi yan tarafının dilimleri baskı mümkündür:

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

Bu beni nereye gitmek istediğimin bir parçası haline getiriyor, ama ben argümanlar arasındaki boşlukları nasıl artıracağımı, "argümanlarını" eklemekten başka bir şey yapamayacağımı göremiyorum ve bu argümanların isimlerini de göstermek güzel olurdu. isimleri var. – user101089

+0

Yanıtı, yapılandırılabilir sütunların genişliğini yapmak ve matris adlarıyla bir başlık eklemek için uzattım. – Stibu