- 本文是本人在根据matlab的代码转化为R语言时的一步,分为两种情况。
第一种情况是matlab的pdist(X,'Consine'){一个矩阵的各个点之间的夹角余弦};
第二种情况是matlab的1-pdist2(X,Y,'Consine'){两个矩阵,一个矩阵的点到另外一个矩阵任何一个点的夹角余弦}
理解夹角余弦公式:两个点的夹角余弦公式:
- 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))
#注意理解转置后的运算达到的目的,对着公式理解
- 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)