2016-07-28 81 views
1

我有一個n x p矩陣,看起來像這樣:「角化」矩陣中的每一行

n = 100 
p = 10  
x <- matrix(sample(c(0,1), size = p*n, replace = TRUE), n, p) 

我想沿着第一維A,其k個項創建n x p x p陣列是包含p x p對角矩陣x[k,]的元素。 R中最有效的方法是什麼?我正在尋找一種使用outer(或其他矢量化方法)的方法,而不是apply函數之一。

解決方案使用lapply

A <- aperm(simplify2array(lapply(1:nrow(x), function(i) diag(x[i,]))), c(3,2,1)) 

我正在尋找的東西比這更有效。

感謝。

回答

2

作爲一個起點,這裏有一個簡單的for循環方法,預分配矩陣。

# pre-allocate matrix of desired size 
myArray <- array(0, dim=c(ncol(x), ncol(x), nrow(x))) 
# fill in array 
for(i in seq_len(nrow(x))) myArray[,,i] <- diag(x[i,]) 

它應該運行得相對較快。在我的機器上,對於1000 X 100矩陣,lapply方法耗時0.87秒,而for循環(包括陣列預分配)耗時0.25秒將矩陣轉換爲所需陣列。所以for環路的速度快了3.5倍。


轉你原來的矩陣

還要注意R上的矩陣該行的操作往往比列操作慢。這是因爲矩陣按列存儲在內存中。如果轉置矩陣並以此方式執行操作,則在100X1000矩陣上完成操作的時間將減少爲0.14,爲第一個循環的一半,比lapply方法快7倍。

相關問題