2013-01-14 40 views
8

我需要訪問並分配for循環中的m * n矩陣的單個槽。到目前爲止的代碼:將值分配給矩陣的對角條目

rowCount <- 9 
similMatrix = matrix(nrow = rowCount - 1, ncol = rowCount) 
show(similMatrix) 
for(i in (rowCount - 1)){ 
    for (j in rowCount) 
    if (i == j){ 
     similMatrix[i == j] <- 0; 
    } 
} 
show(similMatrix) 

所以,如果我= j的矩陣中的NA值需要與0

+0

你是不是獲得期望的輸出? –

回答

10

爲目的將「對角線」元素設置爲零,你已經得到了答案,但我想知道你是否希望得到更一般的東西。該代碼缺乏成功的原因有兩方面:你的索引的構建有缺陷,並且索引是錯誤的。這將成功:

for(i in 1:(rowCount - 1)){ # need an expression that retruns a sequence 
    for (j in 1:rowCount)  # ditto 
    if (i == j){ 
     similMatrix[i,j] <- 0; # need to index the matrix with two element if using i,j 
    } 
} 
#---------- 
> show(similMatrix) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 0 NA NA NA NA NA NA NA NA 
[2,] NA 0 NA NA NA NA NA NA NA 
[3,] NA NA 0 NA NA NA NA NA NA 
[4,] NA NA NA 0 NA NA NA NA NA 
[5,] NA NA NA NA 0 NA NA NA NA 
[6,] NA NA NA NA NA 0 NA NA NA 
[7,] NA NA NA NA NA NA 0 NA NA 
[8,] NA NA NA NA NA NA NA 0 NA 

但訴諸於R鍵循環通常被認爲是最後的手段有做同樣的「循環」操作的更加緊湊的方式,它概括(有時錯誤的原因。)比設定對角線更廣泛。

similMatrix[ row(similMatrix) == col(similMatrix) ] <- 0 
> similMatrix 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 0 NA NA NA NA NA NA NA NA 
[2,] NA 0 NA NA NA NA NA NA NA 
[3,] NA NA 0 NA NA NA NA NA NA 
[4,] NA NA NA 0 NA NA NA NA NA 
[5,] NA NA NA NA 0 NA NA NA NA 
[6,] NA NA NA NA NA 0 NA NA NA 
[7,] NA NA NA NA NA NA 0 NA NA 
[8,] NA NA NA NA NA NA NA 0 NA 

如果你想設置的次對角爲零,你可以只使用:

similMatrix[ row(similMatrix)-1 == col(similMatrix) ] <- 0 

可避免產生多餘的行和使用列矩陣這樣的:

mind <- min(dim(similMatrix)) 
# avoid going outside dimensions if not symmetric 
similMatrix[ cbind(seq(maxd),seq(maxd)) <- 0 
+0

這是完美的,非常感謝你! –

+1

我想'行(mat)'和'col(mat)'會生成兩個矩陣,這是不是意味着我們在這裏內存消耗增加了三倍 ?如果'墊'發生 是大,我想這可能會導致問題。 – qed

+0

非常正確。我沒有看到任何警告,這些是大矩陣。我提供的「緊湊性」是表達式,但正如你所指出的那樣,這可能不是緊湊的內存佔用。我們可以想象使用'similMatrix [cbind(1:(rowCount - 1),1:(rowCount - 1)] < - 0',我猜測它對內存和速度都會表現出色。認爲這可能會有更小的佔地面積,因爲這種「墊[diag(mat)] <-0」方法。 –

27

替換你想要的功能diag<-

m <- matrix(1:12, nrow=3) 
m 
    [,1] [,2] [,3] [,4] 
[1,] 1 4 7 10 
[2,] 2 5 8 11 
[3,] 3 6 9 12 

diag(m) <- 0 
m 
    [,1] [,2] [,3] [,4] 
[1,] 0 4 7 10 
[2,] 2 0 8 11 
[3,] 3 6 0 12 
+0

「刪除我的答案 - 並提出其他」按鈕在哪裏? – mnel

+0

謝謝,它的工作原理,但我現在如何分配一個值讓我們說m [1,2]? –