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