2014-04-04 19 views
5

Insegno matematica e programmazione (con R) all'università e sono un grande fan di una notazione buona e coerente. Si prega di dare un'occhiata alle seguenti operazioni vettoriali semplici in R:Operazioni vettoriali incoerenti in R?

> v1 <- c(1,2,3) 
> v2 <- c(4,5,6) 
> v1 %*% v2 
    [,1] 
[1,] 32 
> t(v1) %*% v2 
    [,1] 
[1,] 32 
> v1 %*% t(v2) 
    [,1] [,2] [,3] 
[1,] 4 5 6 
[2,] 8 10 12 
[3,] 12 15 18 
> t(v1) %*% t(v2) 
Error in t(v1) %*% t(v2) : non-conformable arguments 
> v1 + v2 
[1] 5 7 9 
> v1 + t(v2) 
    [,1] [,2] [,3] 
[1,] 5 7 9 
> t(v1) + t(v2) 
    [,1] [,2] [,3] 
[1,] 5 7 9 

Penso che ci sono alcune incongruenze qui: o mi manca qualcosa o R sembra essere del tutto arbitraria rispetto a quali risultati si ottiene quando si sia trasporre un vettore o no.

Qual è la logica sottostante qui (che a proposito sembra essere completamente diversa da Matlab).

+1

Perché l'hai taggato con 'Matlab'? – Dan

+1

Sono d'accordo sul fatto che le regole di Matlab siano più coerenti. R cerca di fare cose (promuovere i vettori in matrici di righe o colonne come sembra appropriato, lasciando cadere le dimensioni) che sono convenienti per l'analisi interattiva. Il suo comportamento ** è ** ben definito, come indica la risposta di @ GavinKelly qui sotto, ma ciò non significa che a volte non sia confuso. –

risposta

6

?%*% dà la logica:

Moltiplica due matrici, se sono conformabile. Se un argomento è un vettore, verrà promosso a una matrice riga o colonna per rendere i due argomenti conformi. Se entrambi sono vettori, lo restituirà il prodotto interno (come una matrice).

Se sono entrambi i vettori (primo esempio), si ottiene il prodotto interno. Se mettete uno t() lì dentro, il vettore verrà lanciato come matrice di colonne, e un vettore è effettivamente una matrice di righe, quindi si applicano regole conformi alle norme.

Analogamente, la pagina di aiuto per "+" dice che getterà gli argomenti ai vettori - e fornisce alcune indicazioni sulla "forma" del risultato.

Problemi correlati