2017-06-05 68 views
1

我想创建一个使用两个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){ }}

+5

你必须使用双循环? 'p%*%t(q)'或'outer(p,q,'*')''似乎是更好的解决方案。 – G5W

+0

恐怕,我的R技能不足以理解你的评论。你可以把你的评论作为第二个答案吗? – Xarrus

+1

作为[row,column]的R指数,所以你想要这样组装你的矩阵。 – Matt

回答

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="")) 
    } 
} 
+0

mymatrix [i,j]是第i行第j列的元素,对吗? – Xarrus

+1

mymatrix [i,j]是第i行和第j列。我不确定你想要的数字安排是什么,或者你的数据是如何表示的。如果你有变量名为“p_1”,“p_2”等,这个答案将起作用,但这绝对不是将数据存储在R中的最佳方式。它们应该是2个单独的名为p和q的向量,然后你可以访问你的数字与p [1],p [2]等相关。 –

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.指定矩阵乘法(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为*

+0

P和q不是全局环境中的元素:有10个变量,名为'p_1','p_2',...'p_5', q_1' ...'q_5'。此外,该问题明确要求使用两个for循环的解决方案。尽管在R中不是最佳实践,但回答非循环答案并不能回答这个问题。 –

+0

@ConCave我最初写这个作为注释,指出它没有使用循环。该OP邀请我将其作为答案。 – G5W

+0

没关系,对不起。感谢您提供更详细的评论。 –