我已经和R一起练习了一年了,现在我面临着一个新的问题:vectorization.基本上我希望我的代码更快。这是我的问题:我有一个包含0和1的矩阵,我想比较每一行和其他行,以找到相同位置的匹配。例如,我的矩阵是:a<-matrix(c(1,1,1,0,1,1,0,1,0,1,0,1,0,0,0),5,3)。在这种情况下,第一行和第二行有一个匹配,第一个和第三个匹配。我想要建立一个对称矩阵行维,并在每一个地方写的匹配和,在对角线上0。
我写的代码是:
a<-matrix(sample(c(0,1), size=18, replace=T), ncol=3) # a random matrix 6x3
mat<-diag(0,nrow=dim(a)[1])
n<-dim(a)[1]
for( i in 1:(n-1)){
for (j in (i+1):n){
mat[i,j]<-sum(ifelse(a[i,]==a[j,],1,0))
}}我正在寻找一些东西来改进这段代码并删除for循环。我当时正在申请,但除了第二行和最后一排外,一切都适用:
for( i in 1:(n-2)){
vv<-a[(i+1):n,]
mat3[i,(i+1):n]<-apply(vv,1,function(x) sum(ifelse(x==a[i,],1,0)))
}我不得不在for循环中放置2而不是1,因为应用只处理矩阵而不是数组(实际上,vv将是一个数组)。提前谢谢你。
发布于 2017-09-21 18:37:05
你可以简单地做tcrossprod(a) + tcrossprod(1 - a)
https://stackoverflow.com/questions/46347927
复制相似问题