2012-04-26 60 views
4

我正在與R.Matlab的稀疏(I,J,S,M,N)相當於R中

工作我具有矩陣結構,但存儲在三個列表IND1,IND2和VAL中,每個相同的長度N;我需要在VAL的值存儲在一個矩陣MAT這樣的:

for each i in 1 to N: 
    MAT[IND1(i), IND2(i)] == VAL(i) 

正如您可以猜到MAT的最終大小不一定是N×N的,但我知道的大小必須是什麼(命名爲m,如果你需要知道尺寸,因爲對我來說它必須是一個方形矩陣)。

Matlab的有一個很好的函數來創建一個sparse矩陣正是這樣做的,但我需要在語言R鍵實現這一點,希望沒有循環,沒有人知道是否可以做到這一點,並會請告訴我如何。提前致謝。

P.S:我已經嘗試了很明顯的:

MAT <- matrix(nrow=m, ncol=m) 
MAT[IND1, IND2] <- VAL 

,但我得到一個奇怪的結果(所有行具有相同的重複值)

回答

6

迪文是正確的 - 矩陣包是要走的路。但是,如果您有大量數據,我發現替換類型的值替換可能會掛起或需要很長時間。更好的方法可能是創建一個類sparseMatrix對象,然後根據需要轉換爲類矩陣。防爆。

set.seed(1) 
n=50 
x <- sample(seq(100), n) 
y <- sample(seq(100), n) 
z <- runif(n) 
cbind(x,y,z) 

library(Matrix) 
s.mat <- sparseMatrix(i=x, j=y, x=z) 
dim(s.mat) 
image(s.mat) 

#convert to a class matrix if needed 
mat <- as.matrix(s.mat) 
mat[which(mat==0)] <- NaN 

enter image description here

+0

+1 - 打敗我,儘管我只是發佈了一個雙線:'圖書館(矩陣); sparseMatrix(i = c(1,3,5),j = c(4,1,9),x = 10:12)'! – 2012-04-26 14:02:35

4

矩陣封裝提供了多種稀疏矩陣類。在創建稀疏矩陣對象後,您將按照上述方式加載數值:

library(Matrix) 
?Matrix 

...將幫助您開始。順便說一句,在方式加載密集矩陣代碼,你說明是:

M <- matrix(NA, nrow=max(c(IND1,IND2)), ncol=max(c(IND1,IND2))) # could use higher numbers 
M[ cbind(IND1, IND2) ] <- VAL 
+0

謝謝迪文,第二部分是一個我一直在尋找。 – pablete 2012-04-26 14:17:27