2015-09-23 79 views
0

是的,R中的循環非常慢。但是我不知道如何用像這樣的代碼替換循環,其中每個矩陣單元都是針對所有其他單元計算的。結果是再次矩陣:在R中應用一個沒有循環的矩陣函數

for(i in 1:ncol(matrix)) { 
    for(j in 1:ncol(matrix)) { 
     result[i,j] <- function(set[i]),set[j])) 
    } 
} 

你能幫忙嗎?


編輯:

矩陣如下所示:

A B C D E F 
A 0 0 1 0 1 0 
B 1 0 0 0 1 0 
C 1 0 0 1 0 0 
D 0 0 0 0 0 1 
E 1 1 0 1 0 1 
F 0 0 1 0 1 0 

我想申請的功能是

getCosine <- function(x,y) 
{ 
    this.cosine <- sum(x*y)/(sqrt(sum(x*x)) * sqrt(sum(y*y))) 
    return(this.cosine) 
} 

在循環,它看起來是這樣的:

result[i,j] <- getCosine(as.matrix(a[i]), as.matrix(a[j])) 
+0

嘗試使用'apply' – arodrisa

+4

請提供一個可重複使用的'set'示例和您想要應用的函數。你的代碼是無效的語法, – Roland

+0

你打算第一行是'for(i in 1:nrow(matrix))'嗎? – Whitebeard

回答

3

假設你想找到的每一列,你可以使用類似這樣每隔一列之間的夾角的餘弦值:

sapply(df, function(y) sapply(df,get.cos,y)) 

下面是完整的代碼。

df = read.table(h=T,row.names=1,text=" 
       A B C D E F 
       A 0 0 1 0 1 0 
       B 1 0 0 0 1 0 
       C 1 0 0 1 0 0 
       D 0 0 0 0 0 1 
       E 1 1 0 1 0 1 
       F 0 0 1 0 1 0") 
get.cos <- function(x,y) sum(x*y)/sqrt(sum(x*x)*sum(y*y)) 
# using loops 
result.1 <- matrix(NA, nc=ncol(df),nr=nrow(df)) 
for(i in 1:ncol(df)) { 
    for(j in 1:ncol(df)) { 
    result.1[i,j] <- get.cos(df[,i],df[,j]) 
    } 
} 
result.1 
#   [,1]  [,2]  [,3]  [,4]  [,5]  [,6] 
# [1,] 1.0000000 0.5773503 0.0000000 0.8164966 0.3333333 0.4082483 
# [2,] 0.5773503 1.0000000 0.0000000 0.7071068 0.0000000 0.7071068 
# [3,] 0.0000000 0.0000000 1.0000000 0.0000000 0.8164966 0.0000000 
# [4,] 0.8164966 0.7071068 0.0000000 1.0000000 0.0000000 0.5000000 
# [5,] 0.3333333 0.0000000 0.8164966 0.0000000 1.0000000 0.0000000 
# [6,] 0.4082483 0.7071068 0.0000000 0.5000000 0.0000000 1.0000000 
# using sapply(...) 
result.2 <- sapply(df, function(y) sapply(df,get.cos,y)) 
result.2 
#   A   B   C   D   E   F 
# A 1.0000000 0.5773503 0.0000000 0.8164966 0.3333333 0.4082483 
# B 0.5773503 1.0000000 0.0000000 0.7071068 0.0000000 0.7071068 
# C 0.0000000 0.0000000 1.0000000 0.0000000 0.8164966 0.0000000 
# D 0.8164966 0.7071068 0.0000000 1.0000000 0.0000000 0.5000000 
# E 0.3333333 0.0000000 0.8164966 0.0000000 1.0000000 0.0000000 
# F 0.4082483 0.7071068 0.0000000 0.5000000 0.0000000 1.0000000 
+0

謝謝,它的工作原理。速度更好,但是我期望更多的東西可以應用。 •在1176×1176矩陣上循環:20.3分鐘 •應用:13.9分鐘(循環時間的68%): – Larssen