R中的双循环创建矩阵

时间:2017-06-05 19:08:48

标签: r

我想在R中使用两个for循环创建一个5x5矩阵。 我在{1,2,3,4,5}中有5个数字p_j和q_i,i和j。 我想创建一个矩阵,其中(j,i)中的元素由p_j * q_j给出。第j行和第i列。 所以,首先我要创建一个空矩阵m,然后使用for循环填充矩阵。

  

for(i in 1:5){for(j in 1:5){          }}

2 个答案:

答案 0 :(得分:4)

我将介绍我提出的两个解决方案。这两种解决方案都避免了任何明确的循环。大多数在R中,如果很容易避免循环,你可能应该这样做。首先,让我们获取一些示例数据。

set.seed(2017)
p = sample(5)
q = sample(5)
p
[1] 5 3 2 1 4
q
[1] 4 1 2 5 3

这里随机生成p和q。 set.seed部分是这样的,我们都得到相同的"随机"号。

解决方案1 ​​ - 矩阵乘法

p %*% t(q)
     [,1] [,2] [,3] [,4] [,5]
[1,]   20    5   10   25   15
[2,]   12    3    6   15    9
[3,]    8    2    4   10    6
[4,]    4    1    2    5    3
[5,]   16    4    8   20   12

%*%是在R中指定矩阵乘法的方法。
p %*% t(q)将5x1矩阵p乘以1x5矩阵t(q),即q的转置,得到具有所需答案的5x5矩阵。

解决方案2 - 外部

outer(p,q, `*`)
     [,1] [,2] [,3] [,4] [,5]
[1,]   20    5   10   25   15
[2,]   12    3    6   15    9
[3,]    8    2    4   10    6
[4,]    4    1    2    5    3
[5,]   16    4    8   20   12

r中的函数outer创建"外部产品"两个向量的组合 - 也就是说,它采用p元素和q元素的所有组合,并使用您提供的函数(在本例中为*)将它们组合在一起,这正是您要求的计算。实际上,这可能更简洁地写成outer(p,q),因为默认函数用于组合p& q是*

答案 1 :(得分:2)

假设你有变量名为" p_1"," p_2"在工作环境中:

mymatrix <- matrix(nrow = 5, ncol = 5)
for (i in 1:5) { 
  for (j in 1:5) { 
    mymatrix[i, j] <- get(paste("p_", j, sep="")) * 
                      get(paste("q_", i, sep=""))
  }
}