Умножьте каждую строку матрицы на матрицу - PullRequest
0 голосов
/ 14 сентября 2011

Я новый пользователь 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 ]

3 голосов
/ 14 сентября 2011

Я думал, что у меня есть более умный ответ, но он оказывается медленнее ...

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 голос
/ 14 сентября 2011

Как это?

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)))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...