我想创建一个使用两个for循环中的R 5x5矩阵。 我有5个数字p_j和q_i与{1,2,3,4,5}中的i和j。 我想创建一个矩阵,其中(j,i)中的元素由p_j * q_j给出。第j行和第i列。 所以,首先我想创建一个空矩阵m
,然后使用for循环填充矩阵。双人间环R中创建一个矩阵
的(我在1:5){为(j在1:5){ }}
我想创建一个使用两个for循环中的R 5x5矩阵。 我有5个数字p_j和q_i与{1,2,3,4,5}中的i和j。 我想创建一个矩阵,其中(j,i)中的元素由p_j * q_j给出。第j行和第i列。 所以,首先我想创建一个空矩阵m
,然后使用for循环填充矩阵。双人间环R中创建一个矩阵
的(我在1:5){为(j在1:5){ }}
假设你有一个名为 “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=""))
}
}
mymatrix [i,j]是第i行第j列的元素,对吗? – Xarrus
mymatrix [i,j]是第i行和第j列。我不确定你想要的数字安排是什么,或者你的数据是如何表示的。如果你有变量名为“p_1”,“p_2”等,这个答案将起作用,但这绝对不是将数据存储在R中的最佳方式。它们应该是2个单独的名为p和q的向量,然后你可以访问你的数字与p [1],p [2]等相关。 –
我将通过两个我提出的解决方案。这两种解决方案都避免了任何显式循环。大部分在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.指定矩阵乘法(q)中的方式
p %*% t(q)
乘以1×5矩阵T中的5×1矩阵P,Q的转置,产生具有期望答案的5×5矩阵。
解决方案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
,创建两个向量的“外积” - 即,它需要和q的元素P的要素的所有组合并使用您提供的函数(在此例中为*
)将它们结合起来,这正是您所要求的计算。其实,这也可以写成更简洁的outer(p,q)
因为默认功能使用结合p & q为*
。
P和q不是全局环境中的元素:有10个变量,名为'p_1','p_2',...'p_5', q_1' ...'q_5'。此外,该问题明确要求使用两个for循环的解决方案。尽管在R中不是最佳实践,但回答非循环答案并不能回答这个问题。 –
@ConCave我最初写这个作为注释,指出它没有使用循环。该OP邀请我将其作为答案。 – G5W
没关系,对不起。感谢您提供更详细的评论。 –
你必须使用双循环? 'p%*%t(q)'或'outer(p,q,'*')''似乎是更好的解决方案。 – G5W
恐怕,我的R技能不足以理解你的评论。你可以把你的评论作为第二个答案吗? – Xarrus
作为[row,column]的R指数,所以你想要这样组装你的矩阵。 – Matt