我是一个新的R用户,我有一种算法问题。我在网上和Stackoverflow上做了一些研究,但找不到我的答案。
我有一个平方矩阵,例如:
A B C D
A 0 0 0 1
B 0 1 1 0
C 1 0 0 0
D 0 1 1 1
此矩阵表示关键字(此处为A,B,C和D)之间的链接。 “1”(或“真”)表示关键字是相关的。例如,第一行的“1”表示 A链接到D 。
我需要在矩阵上找到两个链接最多的关键字。我知道我需要计算每一行和初始矩阵之间的标量积。然后我取出行的总和并获得最大值。 但是,什么是R程序在我的矩阵的每一行和矩阵本身之间放入一个新矩阵?
谢谢!
答案 0 :(得分:3)
我以为我有一个更聪明的答案,但事实证明它更慢......
tmp1 <- function(a) {
n <- nrow(a)
aa <- apply(array(apply(a,1,"*",a),
rep(n,3)),3,rowSums)
apply(aa,2,which.max)
}
以前的解决方案:
tmp2 <- function(a) {
n <- nrow(a)
r <- numeric(n)
for(i in seq(n)) {
b <- rowSums(a[i,]*a)
r[i] <- which.max(b)
}
r
}
在相当大的东西上测试:
n <- 50
a <- matrix(0,nrow=n,ncol=n)
a[sample(length(a),size=n^2/5,replace=TRUE)] <- 1
all(tmp1(a)==tmp2(a)) ## TRUE
library(rbenchmark)
benchmark(tmp1(a),tmp2(a))
> benchmark(tmp1(a),tmp2(a))
test replications elapsed relative user.self sys.self
1 tmp1(a) 100 4.030 9.264368 2.052 1.96
2 tmp2(a) 100 0.435 1.000000 0.232 0.20
如果你可以用稀疏矩阵来做,你可能会做得更好。
答案 1 :(得分:1)
喜欢这个吗?
a=matrix(c(0,0,0,1,0,1,1,0,1,0,0,0,0,1,1,1), ncol=4, byrow=T)
for(i in 1:4){
b = rowSums(a[i,]*a)
print(which(b==max(b)))
}