0

我希望在 R 中编写一个简单的代码来生成一个如下所示的矩阵。

我知道你开始一个像:

 for(i in 1:10){

但我不确定从这里去哪里。我知道我可以使用outer(1:10,1:10)但我希望使用for() do()声明。

    1   2   3   4   5   6   7   8   9   10
 1  1   2   3   4   5   6   7   8   9   10  
 2  2   4   6   8   10  12  14  16  18  20  
 3  3   6   9   12  15  18  21  24  27  30  
 4  4   8   12  16  20  24  28  32  36  40  
 5  5   10  15  20  25  30  35  40  45  50  
 6  6   12  18  24  30  36  42  48  54  60  
 7  7   14  21  28  35  42  49  56  63  70  
 8  8   16  24  32  40  48  56  64  72  80  
 9  9   18  27  36  45  54  63  72  81  90 
 10 10  20  30  40  50  60  70  80  90 100  
4

3 回答 3

1

免责声明:这是一种愚蠢的做法,因为outer它是一种更好的选择。出于娱乐和教育目的:

#Define dimensions
matx <- 10
maty <- 10
mat <- matrix(NA, matx, maty)

#For loop
for(i in seq_len(maty)){
  mat[,i] <- i * seq_len(matx)
}

请注意,我在循环之前定义了矩阵的大小。这将防止R Inferno中描述的生长对象的恐怖。

于 2013-01-20T13:28:36.020 回答
1

让我解释一下outer,你需要 2 个循环(至少如果我想实现它我会怎么做)

v <- c()
for(i in 1:10)
  for(j in 1:10)
    v <- c(v,i*j)      ## This is SLOW! (naughty)
matrix(v,ncol=10,nrow=10)

编辑

在我的最后一个实现中,我动态分配了非常慢的矩阵大小。最好在循环之前分配矩阵,如下所示:

xx <- matrix(NA,ncol=10,nrow=10)
for(i in 1:10)
  for(j in 1:10)
    xx[i,j] <- i*j 

使用向量的另一种方法:

I <- 1:10
J <- 1:10
I %*% t(J)
于 2013-01-20T13:34:33.170 回答
0

另一个建议:

lines = 10
output= seq(from=1,by=1,length.out=columns)
i=2
while (i<lines+1){
  temp2 = seq(from=i, by=i, length.out=lines)
  output= cbind(output, temp2)
  i = i+1
}
于 2013-01-20T13:52:51.410 回答