将矩阵的每一行乘以矩阵

时间:2011-09-13 23:38:02

标签: r

我是一个新的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程序在我的矩阵的每一行和矩阵本身之间放入一个新矩阵?

谢谢!

2 个答案:

答案 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)))
}