R语言计算夹角余弦(Consine)

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

  • 本文是本人在根据matlab的代码转化为R语言时的一步,分为两种情况。

第一种情况是matlab的pdist(X,'Consine'){一个矩阵的各个点之间的夹角余弦};

第二种情况是matlab的1-pdist2(X,Y,'Consine'){两个矩阵,一个矩阵的点到另外一个矩阵任何一个点的夹角余弦}

理解夹角余弦公式:两个点的夹角余弦公式:cos(\theta )=\frac{x1x2+y1y2}{\sqrt{x1^2+y1^2}\sqrt{x2^2+y2^2}}

  1. 1一个矩阵点之间的夹角余弦:

matlab的代码为

D1 = pdist(X,'consine')

R语言相应的代码为:

 Consine=matrix(data=0,nrow =dim(X)[1],ncol = dim(X)[1])
这个参考了其他博主的文章做出来的
for (i in 1:dim(X)[1])
   for (j in 1:dim(X)[1])
         if (i < j)
            Consine[i,j] = sum(t(X[i,])*X[j,])/sqrt((sum(X[i,]^2))*sum(X[j,]^2))
#注意理解转置后的运算达到的目的,对着公式理解
  1. 2两个矩阵,第一个矩阵的每一个点到另外一个矩阵的每一个点之间的夹角余弦距离

matlab版的代码:

 Cosine   = 1 - pdist2(PopObj,Z,'cosine');
%%PopObj和Z是本人复现代码时的两个矩阵PopObj(130*3),Z(105*3)
%%得出的结果Consine(130*105)

R语言对应的代码:

#此代码段得出的结果和matlab代码得出得数据完全一样,只是本人在转换中的一步
Consine=matrix(data=0,nrow =dim(PopObj)[1],ncol = dim(Z)[1])
#Tips:如果不对Cosine进行设置会报错(incorrect number of subscripts on matrix)
#本人就是因为这个地方,两个矩阵之间的运算时一直报错
for (m in 1:dim(PopObj)[1]) {
  for (n in 1:dim(Z)[1]) {
    Consine[m,n]=sum(t(PopObj[m,])*Z[n,])/sqrt(sum(PopObj[m,]^2)*sum(Z[n,]^2))
  }
}
#PopObj和Z是本人复现代码时的两个矩阵PopObj(130*3),Z(105*3)
#得出的结果Consine(130*105)

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值