2016-08-18 4 views
1

Ich empfinde Matrixoperationen in R ist sehr verwirrend: Wir mischen Zeilen- und Spaltenvektoren.Matrix- und Vektormultiplikationsoperation in R

  • Hier definieren wir x1 als Vektor (I R-Standardvektor ist ein Spaltenvektor annehmen? Aber es zeigt nicht, dass es auf diese Weise angeordnet ist.)

  • Dann definieren wir x2 a transponieren von x1, was mir auch das Display seltsam vorkommt.

  • Schließlich, wenn wir als eine Matrix definieren, scheint die Anzeige besser.

Nun ist meine Frage, dass x1 und x2 sind völlig verschiedene Dinge (eine ist von einem anderen transponieren), aber wir haben die gleichen Ergebnisse hier.

Irgendwelche Erklärungen? Vielleicht sollte ich Vektor- und Matrixoperationen nicht miteinander kombinieren?

x1 = c(1:3) 
x2 = t(x1) 
x3 = matrix(c(1:3), ncol = 1) 

x1 
[1] 1 2 3 

x2 
    [,1] [,2] [,3] 
[1,] 1 2 3 

x3 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 

x3 %*% x1 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 2 4 6 
[3,] 3 6 9 

x3 %*% x2 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 2 4 6 
[3,] 3 6 9 

Antwort

5

Siehe ?`%*%`:

Beschreibung:

Multiplies two matrices, if they are conformable. If one argument 
is a vector, it will be promoted to either a row or column matrix 
to make the two arguments conformable. If both are vectors of the 
same length, it will return the inner product (as a matrix). 
+0

gut, danke für die Information. Ich hoffe, wir können einen Matlab-Stil haben, der mir nur einen Fehler gibt, anstatt etwas automatisch zu machen. – hxd1011

+3

Beachten Sie auch: R behandelt Vektoren nicht als Zeilen- oder Spaltenvektor, was sich leicht daran erkennen lässt, dass "dim (x) == NULL" und "dim (t (x)) == c (1 , 3) '. Das Missverständnis entsteht, wenn Benutzer annehmen, dass R Zeilenvektoren definiert, weil 'c()' scheinbar "in einer Reihe" definiert ist. In gewisser Weise stimmt die R-Definition jedoch mit der mathematischen Definition überein, die Vektoren nicht notwendigerweise als Zeilen- oder Spaltenvektoren deklariert, abgesehen von der Notationskonvention beim Arbeiten mit Matrizen. – SimonG

1

Versuchen Sie, die folgenden

library(optimbase) 
x1 = c(1:3) 
x2 = transpose(x1) 

x2 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 

Im Gegensatz zu:

x2.t = t(x1) 
x2.t 
    [,1] [,2] [,3] 
[1,] 1 2 3 

Siehe Dokumentation von transpose

transpose is a wrapper function around the t function, which tranposes matrices. Contrary to t, transpose processes vectors as if they were row matrices.

4

Ein numerischer Vektor der Länge 3 ist kein "Spaltenvektor" in dem Sinne, dass es nicht eine Dimension hat. Allerdings ist es durch% *% behandelt bekommen, als ob es sich um eine Matrix der Dimension waren 1 x 3, da dies gelingt:

x <- 1:3 
A <- matrix(1:12, 3) 
x %*% A 
#------------------ 
    [,1] [,2] [,3] [,4] 
[1,] 14 32 50 68 
#----also---- 
crossprod(x,A) # which is actually t(x) %*% A (surprisingly successful) 

    [,1] [,2] [,3] [,4] 
[1,] 14 32 50 68 

Und das nicht:

A %*% x 
#Error in A %*% x : non-conformable arguments 

Behandlung mit einem Atomvektor auf die Die gleiche Grundlage wie eine Matrix der Dimension nx1-Matrix ist sinnvoll, weil R seine Matrixoperationen mit Spalten-Hauptindexierung handhabt. Und R Assoziativität Regeln gehen von links nach rechts, so gelingt dies auch:

y <- 1:4 
x %*% A %*% y 
#--------------  
[,1] 
[1,] 500 

Beachten Sie, dass as.matrix gehorchen diese Regel:

> as.matrix(x) 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 

Ich denke, Sie sollten die ?crossprod Hilfeseite für ein paar weiteren Details lesen und Hintergrund.