我觉得很愚蠢,但R的 crossprod
函数对矢量输入的意图是什么?我想计算欧几里德空间中两个向量的交叉积,并错误地尝试使用 crossprod
.
矢量叉积的一个定义是 N = |A|*|B|*sin(theta)
,其中θ是两个矢量之间的角度 . ( N
的方向垂直于A-B平面) . 另一种计算方法是 N = Ax*By - Ay*Bx
.base::crossprod
显然不做这个计算,实际上产生了两个输入的矢量点积 sum(Ax*Bx, Ay*By)
.
所以,我可以轻松编写自己的 vectorxprod(A,B)
函数,但我无法弄清 crossprod
一般在做什么 .
5 回答
根据R中的帮助函数:crossprod(X,Y)= t(X)%*%Y是一个比表达式本身更快的实现 . 它是两个矩阵的函数,如果你有两个向量对应于点积 .
这是一个简短的代码片段,只要交叉产品有意义就可以使用:3D版本返回一个向量,2D版本返回一个标量 . 如果您只是想要简单的代码,无需引入外部库即可提供正确的答案,这就是您所需要的 .
有效吗?
我们来看看a random example I found online:
看起来不错!
为什么这比以前的答案更好?
它's 3D (Carl' s仅为2D) .
这很简单,也很惯用 .
评论和格式很好;因此,易于理解
缺点是数字'3'已经多次硬编码 . 实际上,这并不是一件坏事,因为它突出了矢量交叉产品纯粹是3D构造的事实 . 就个人而言,我建议改为ditching cross products entirely和learning Geometric Algebra . :)
帮助
?crossprod
非常清楚地解释了它 . 以线性回归为例,对于模型y = XB + e
,您要查找X'X
,X
转置和X
的乘积 . 为此,一个简单的调用就足够了:crossprod(X)
与crossprod(X,X)
相同,与t(X) %*% X
相同 . 此外,crossprod
可用于查找两个向量的点积 .为了回应@Bryan Hanson的要求,这里有一些Q&D代码来计算平面中两个向量的向量叉积 . 计算一般的3空间矢量交叉产品或扩展到N空间有点麻烦 . 如果你需要那些,你将不得不去维基百科:-) .
这是3D矢量的简约实现:
如果你想获得2D矢量
u
和v
的标量"cross product",你可以做