2013-03-28 50 views
3

我是新來的R和這是我的代碼:意外矩陣結果中的R

f2 = function(n){ 
E = matrix(c(0),nrow = (n+1), ncol = (n+1)); 
k = -1; 
for(j in 1:n+1){ 
k = k + 1; 
l = 0; 
for(i in 1:n+1){ 
    if(k == 0){E[i,j] = 1;} 
    if(k == 1){E[i,j] = 1 - (2*l)/n;} 

    l = l + 1; 
} 
} 
print(E); 

} 

這對於N = 2打印時,這種 「意外」 的結果:

> f2(2) 
    [,1] [,2] [,3] 
[1,] 0 0 0 
[2,] 0 1 1 
[3,] 0 1 0 

但我要打印:

> f2(2) 
    [,1] [,2] [,3] 
[1,] 1 1 0 
[2,] 1 0 0 
[3,] 1 -1 0 

,我認爲我的邏輯是正確的,因爲我在Java中太 試過,我曾預期的結果,所以我不知道這裏有什麼問題。 不幸的是,這是一個更大的程序的開始,我想 完成,所以它真的很煩人,如果你能告訴我一個更好的方法 在R中創建和操縱矩陣,這將是非常有益的。

+1

用'1:(n + 1)'替換'1:n + 1'。 – joran

+1

括號是你的朋友,請看::) –

+0

歡迎來到R!隨意在門口留下這些分號:) – Gregor

回答

1

作爲視覺助手上述評論:

> 1:5+1 
[1] 2 3 4 5 6 

> 1:(5+1) 
[1] 1 2 3 4 5 6 
> 
+0

謝謝,有時我發誓我必須在屏幕前失明,我還需要一些睡眠:)。 – Gofoboso

4

...但更普遍的,你最終會成爲非常不滿這種風格的R代碼裏面。使用其他語言的知識(Java?)很好,但是如果你像Java一樣編寫R代碼,那麼你真的會非常討厭R.

這在R方式中完全相同:

> k <- matrix(0:2,3,3,byrow = TRUE) 
> l <- matrix(0:2,3,3) 
> ifelse(k == 0,1,ifelse(k == 1,1 - (2*l)/2,0)) 
    [,1] [,2] [,3] 
[1,] 1 1 0 
[2,] 1 0 0 
[3,] 1 -1 0 
+0

是的,我開始看到,幸運的是它將成爲我最後一個項目之一,因爲現在開始使用並習慣另一種風格是非常痛苦的。 – Gofoboso

+0

+1進行清理。但是,如果有人不熟悉'R' –

+0

@RicardoSaporta我同意嵌套'ifelse'語句可能會有點混淆。我提出這是作爲一種「下一步」的工作。 – joran

1

繼@joran,任意n的概括:

f3 <- function(n) 
{ 
    E <- matrix(0, nrow = (n+1), ncol = (n+1)) 
    E[,1] <- 1 
    E[,2] <- seq(from=1, to=-1, length.out=n+1) 
    E 
} 

爲了顯示矢量化的功率:

> system.time(M <- f2(5000)) 
    user system elapsed 
    41.37 0.20 41.78 
> system.time(N <- f3(5000)) 
    user system elapsed 
    0.07 0.11 0.19 

(用括號固定f2並刪除print