【问题标题】:Finding dot product in r在r中查找点积
【发布时间】:2015-02-03 08:17:47
【问题描述】:

我试图在 R 中找到两个矩阵的点积。在必须转置的 q 矩阵中,我有三个不同的 q 值,它们是我之前随机生成的,在 z 矩阵中,三个随机生成的 z 值作为随机点 i 的坐标。我有:

    z0= NULL
    for (i in 1:100){
        z0[i]= 1
    }
    z1= runif(100, min=0, max= 20)
    z2= runif(100, min=0, max=20)
    q0= runif(1, 0, 1)
    q1= runif(1, 0, 1)
    q2= runif(1, 0, 1)
    i= runif(1, 1, 101)
    i= ceiling(i-1)
    q= matrix(c(q0,q1,q2), ncol=3)
    z= matrix(c(z0[i],z1[i],z2[i]), ncol=3)
    s[i]= t(q)*z

但是,当我尝试计算 s[i] 时,我得到了Error in t(q) * z : non-conformable arrays。我不知道为什么会这样,因为它们似乎都具有相同的长度。

这是我第一次使用 R,所以我不确定发生了什么。

谢谢!

【问题讨论】:

  • 你必须展示一个可重现的例子q= matrix(c(q0,q1,q2), ncol=3) Error in matrix(c(q0, q1, q2), ncol = 3) : object 'q0' not found
  • 点积是%*%
  • @akrun,我已经让它可重现了,抱歉之前没有这样做。
  • @JonathanO'Farrell 你试过帕斯卡的建议吗
  • @Khashaa 我得到了同样的错误“错误在 v %*% w : non-conformable arguments”。 crossprod(v, w) 有帮助。谢谢。

标签: r matrix transpose dot-product


【解决方案1】:

不使用矩阵或任何特殊库:

两个向量的点积可以通过将它们逐元素乘以* 然后求和来计算。

a <- c(1,2,3)
b <- c(4,5,6)

sum(a*b)

【讨论】:

    【解决方案2】:

    正如 Pascal 所说,R 中的点积是 %*%。我可以在您的示例数据上成功使用它:

    > z0= NULL
    > for (i in 1:100){
    +     z0[i]= 1
    + }
    > z1= runif(100, min=0, max= 20)
    > z2= runif(100, min=0, max=20)
    > q0= runif(1, 0, 1)
    > q1= runif(1, 0, 1)
    > q2= runif(1, 0, 1)
    > i= runif(1, 1, 101)
    > i= ceiling(i-1)
    > q= matrix(c(q0,q1,q2), ncol=3)
    > z= matrix(c(z0[i],z1[i],z2[i]), ncol=3)
    > t(q)%*%z
              [,1]     [,2]     [,3]
    [1,] 0.3597998 3.227388 2.960053
    [2,] 0.3544622 3.179510 2.916141
    [3,] 0.3550781 3.185035 2.921208
    > z%*%t(q)
             [,1]
    [1,] 4.340265
    

    【讨论】:

      【解决方案3】:

      示例答案:

      library(geometry)
      dot(A,B)
      

      【讨论】:

        【解决方案4】:

        既然其他人似乎已经解决了你的问题,我就补充说,如果你想要一个特殊的点积函数,你可以自己写一个:

        dot <- function(x, y){   # x and y can be vectors or matrices
            result <- t(x)%*%y   # %*% is the matrix multiplication operator
            print(result)        # t(x) denotes the transpose of x
        }
        

        或者,正如@user3503711 在他的回答中所说,您可以只使用几何库中的 dot() 函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-27
          • 2021-08-04
          • 1970-01-01
          • 2016-07-12
          • 2021-11-22
          • 1970-01-01
          相关资源
          最近更新 更多