2016-04-22 23 views
2

Was mache ich falsch?R - Compute Cross Produkt von Vektoren (Physik)

> crossprod(1:3,4:6) 
    [,1] 
[1,] 32 

Nach dieser Website: http://onlinemschool.com/math/assistance/vector/multiply1/

sollte es geben:

{-3; 6; -3} 

Siehe auch What is R's crossproduct function?

+2

diese Funktion ist nur '1: 3% *% 4: 6 ', nicht crossproduct in der Physik Sinne – jenesaisquoi

+1

Ich stimme wieder zu öffnen, da die Frage scheint zu sein, wie Cross-Produkt in R zu tun und nicht darüber, was 'crossprod' tut. – nicola

+0

@nicola Nichtsdestoweniger erklären die Antworten dort, wie man Kreuzprodukte macht ... – Frank

Antwort

3

Hier ist eine verallgemeinerte Kreuzprodukt:

xprod <- function(...) { 
    args <- list(...) 

    # Check for valid arguments 

    if (length(args) == 0) { 
    stop("No data supplied") 
    } 
    len <- unique(sapply(args, FUN=length)) 
    if (length(len) > 1) { 
    stop("All vectors must be the same length") 
    } 
    if (len != length(args) + 1) { 
    stop("Must supply N-1 vectors of length N") 
    } 

    # Compute generalized cross product by taking the determinant of sub-matricies 

    m <- do.call(rbind, args) 
    sapply(seq(len), 
     FUN=function(i) { 
      det(m[,-i,drop=FALSE]) * (-1)^(i+1) 
     }) 
} 

Für Ihr Beispiel:

> xprod(1:3, 4:6) 
[1] -3 6 -3 

Diese für jede Dimension funktioniert:

> xprod(c(0,1)) # 2d 
[1] 1 0 
> xprod(c(1,0,0), c(0,1,0)) # 3d 
[1] 0 0 1 
> xprod(c(1,0,0,0), c(0,1,0,0), c(0,0,1,0)) # 4d 
[1] 0 0 0 -1 

Siehe https://en.wikipedia.org/wiki/Cross_product

+0

Danke an G. V. Welland für die Idee dahinter (vor vielen Jahren). –

1

crossprod macht folgendes: t(1:3) %*% 4:6

es Daher ist ein 1x3 Vektorzeit sa 3x1 Vektor -> ein Skalar

+0

also was macht das? http://onlinemschool.com/math/assistance/vector/multiply1/ – Kevin

+0

Was NBATrends sagt ist, dass ein Vektor mit denselben Dimensionen einen Vektor erzeugt, in dem Sie, wenn Sie Produktvektoren mit entgegengesetzten Dimensionen kreuzen, eine Zahl erhalten. Die Verknüpfung, die Sie zur Verfügung gestellt haben, kreuzt zwei Vektoren mit ähnlichen Dimensionen, um ein Vektorergebnis zu erzeugen. – scrappedcola

+2

@Kevin Ihr Link bezieht sich auf das Konzept eines Cross-Produkts, ja. Die Autoren von Rs Vorgänger, S, entschieden sich dafür, diesen Begriff auf eine andere Art und Weise wiederzuverwenden, möglicherweise ohne sich der physikalischen Terminologie bewusst zu sein. – Frank

0
crossProduct <- function(ab,ac){ 
    abci = ab[2] * ac[3] - ac[2] * ab[3]; 
    abcj = ac[1] * ab[3] - ab[1] * ac[3]; 
    abck = ab[1] * ac[2] - ac[1] * ab[2]; 
    return (c(abci, abcj, abck)) 
} 
0

crossprod berechnet eine Matrix Product. So führen Sie einen Cross Product, entweder schreiben Sie Ihre Funktion, oder:

> install.packages("pracma") 
> require("pracma") 
> cross(v1,v2) 

wenn die erste Zeile oben nicht funktioniert, versuchen Sie dies:

> install.packages("pracma", repos="https://cran.r-project.org/web/packages/pracma/index.html”)