R中出现意外矩阵

时间:2013-03-28 18:31:42

标签: r matrix

我是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中创建和操作矩阵会非常有用。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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