【发布时间】:2017-09-21 15:33:50
【问题描述】:
我已经使用 R 练习了 1 年,现在我面临一个新问题,称为:矢量化。基本上我希望我的代码更快。
这是我的问题:
我有一个 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,因为 apply 仅适用于矩阵而不适用于数组(实际上最终 vv 将是一个数组)。 提前谢谢你。
【问题讨论】:
标签: r for-loop vectorization apply