2013-03-28 52 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