我想在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){ }}
答案 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=""))
}
}