【问题标题】:R - Compute Cross Product of Vectors (Physics)R - 计算向量的叉积(物理)
【发布时间】:2021-11-24 21:23:53
【问题描述】:

我做错了什么?

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

据本网站:http://onlinemschool.com/math/assistance/vector/multiply1/

它应该给出:

{-3; 6; -3}

另见What is R's crossproduct function?

【问题讨论】:

  • 那个函数只是1:3 %*% 4:6,不是物理意义上的叉积
  • 我投票决定重新开放,因为问题似乎是关于如何在 R 中进行交叉乘积,而不是关于 crossprod 的作用。
  • @nicola 尽管如此,那里的答案确实解释了如何做交叉产品......
  • @Frank 是的,我同意“这个问题在这里已经有了答案”,但不同意“与现有问题完全重复”。问题明显不同。老实说,不确定是否要关闭它...
  • 是的,无论哪种方式都很好。至少他们现在是联系在一起的。

标签: r cross-product


【解决方案1】:

crossprod 执行以下操作:t(1:3) %*% 4:6

因此它是一个 1x3 向量乘以一个 3x1 向量 --> 一个标量

【讨论】:

  • NBATrends 的意思是,相同维度的向量会产生一个向量,如果您将相反维度的乘积向量相交,则会得到一个数字。您提供的链接将 2 个相似维度的向量相乘以产生向量结果。
  • @Kevin 您的链接与叉积的概念有关,是的。 R 的前身 S 的作者选择以不同的方式重用该术语,可能忽略了物理术语。
【解决方案2】:
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))
}

【讨论】:

    【解决方案3】:

    这是一个广义叉积:

    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

    【讨论】:

    • 感谢 G. V. Welland 提出这个想法(多年前)。
    【解决方案4】:

    crossprod 计算一个Matrix Product。要执行Cross Product,请编写您的函数,或者:

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

    如果上面的第一行不起作用,试试这个:

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

    【讨论】:

      【解决方案5】:

      你可以试试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
      

      【讨论】:

        猜你喜欢
        • 2010-09-19
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        • 2011-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多