3

我是 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 中创建和操作矩阵的更好方法,那将非常有帮助。

4

3 回答 3

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
于 2013-03-28T18:51:07.600 回答
1

作为上述评论的视觉辅助:

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

> 1:(5+1)
[1] 1 2 3 4 5 6
> 
于 2013-03-28T18:47:23.480 回答
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

于 2013-03-28T19:10:01.503 回答