在R中找到点积

12

我正在尝试在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]时,我遇到了“t(q)*z: non-conformable arrays”的错误。我不确定为什么会出现这种情况,因为它们似乎具有相同的长度。
这是我第一次使用R,所以我真的不知道发生了什么。
谢谢!

1
你需要展示一个可重现的例子 q= matrix(c(q0,q1,q2), ncol=3) Error in matrix(c(q0, q1, q2), ncol = 3) : object 'q0' not found - akrun
11
点积运算是 %*% - user3710546
@akrun,我已经做到了可重现性,之前没有做到这一点很抱歉。 - Jonathan O'Farrell
1
@Khashaa 我也遇到了同样的错误 "rror in v %*% w : non-conformable arguments"。使用crossprod(v, w)解决了问题。谢谢。 - VishnuVardhanA
a和b都是矩阵:那么a %*% b - Juan Zamora
显示剩余12条评论
4个回答

14

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

两个向量的点乘可以通过将它们逐元素相乘,然后将结果加和来计算。

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

sum(a*b)

一个只适用于向量的特殊情况:OP要求矩阵。 - PatrickT

6

正如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

5

示例答案:

library(geometry)
dot(A,B)

1

看起来其他人已经解决了你的问题,我只想补充一点,如果你想要一个特殊的点积函数,你可以自己编写一个:

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()函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接