R - вычислить перекрестное произведение векторов (физика)

Что я делаю неправильно?

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

По данным этого сайта: http://onlinemschool.com/math/assistance/vector/multiply1/

Это должно дать:

{-3; 6; -3}

Смотрите также Что такое перекрестная функция R?

6 ответов

Решение

Вот обобщенный кросс-продукт:

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

Для вашего примера:

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

Это работает для любого измерения:

> 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

Смотрите https://en.wikipedia.org/wiki/Cross_product

Cross Prod вычисляет Матричный продукт. Чтобы выполнить перекрестный продукт, напишите свою функцию или:

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

если первая строка выше не работает, попробуйте это:

> install.packages("pracma", repos="https://cran.r-project.org/web/packages/pracma/index.html”)
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))
}

crossprod выполняет следующие действия: t(1:3) %*% 4:6

Следовательно, это вектор 1x3, умноженный на вектор 3x1 -> скаляр

      > v=c(1,2,3);w=c(4,5,6)
> c(v[2]*w[3]-v[3]*w[2],v[3]*w[1]-v[1]*w[3],v[1]*w[2]-v[2]*w[1])
[1] -3  6 -3
> i1=c(2,3,1);i2=c(3,1,2);v[i1]*w[i2]-v[i2]*w[i1]
[1] -3  6 -3
> pracma::cross(v,w)
[1] -3  6 -3
> sapply(1:length(v),function(i)det(rbind(v,w)[,-i])*(-1)^(i+1))
[1] -3  6 -3

Обычная операция векторного векторного произведения определяется только в трех измерениях, но последний вариант из принятого ответа обобщается на несколько измерений.pracma::crossреализуется так же, как и первый вариант.

Ты можешь попробовать expand.grid

expand.grid(LETTERS[1:3],letters[1:3])

Выход:

 Var1 Var2
1    A    a
2    B    a
3    C    a
4    A    b
5    B    b
6    C    b
7    A    c
8    B    c
9    C    c
Другие вопросы по тегам