在R中,我有两个不同长度的向量X和Y,比如说
X=1:6
Y=1:8
我想构造一个矩阵,其中每个条目(i,j)对应于(对于某些常数sigma):
dnorm(xi,yj,sigma)
即我想构造一个矩阵m,以便
m= dnorm(1,1,sigma) dnorm(2,1,sigma) ... dnorm(6,1,sigma)
dnorm(1,2,sigma) dnorm(2,2,sigma) ... dnorm(6,2,sigma)
. .
. .
. .
dnorm(1,8,sigma) dnorm(2,8,sigma) ... dnorm(6,8,sigma)
构建此矩阵的最具时效性的方法是什么?我怀疑* apply函数可以以智能方式使用,但我不确定如何使用。
感谢您的帮助!
答案 0 :(得分:0)
这可以进行矢量化:
matrix(dnorm(rep(X,each=length(Y)),rep(Y,length(X)),1),length(Y));
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 3.989423e-01 2.419707e-01 5.399097e-02 0.0044318484 0.0001338302 1.486720e-06
## [2,] 2.419707e-01 3.989423e-01 2.419707e-01 0.0539909665 0.0044318484 1.338302e-04
## [3,] 5.399097e-02 2.419707e-01 3.989423e-01 0.2419707245 0.0539909665 4.431848e-03
## [4,] 4.431848e-03 5.399097e-02 2.419707e-01 0.3989422804 0.2419707245 5.399097e-02
## [5,] 1.338302e-04 4.431848e-03 5.399097e-02 0.2419707245 0.3989422804 2.419707e-01
## [6,] 1.486720e-06 1.338302e-04 4.431848e-03 0.0539909665 0.2419707245 3.989423e-01
## [7,] 6.075883e-09 1.486720e-06 1.338302e-04 0.0044318484 0.0539909665 2.419707e-01
## [8,] 9.134720e-12 6.075883e-09 1.486720e-06 0.0001338302 0.0044318484 5.399097e-02
注意:
rep()
将每个向量重复到length(X)*length(Y)
的相同长度。我们当然必须错开重复的值,以便我们得到x i ,y j 的每个组合。为此,我们必须为each
调用之一使用rep()
参数,为另一个使用times
参数(默认情况下没有明确名称)。dnorm()
会产生上述长度的向量,其中包含线性形式的所需输出值。matrix()
来构建该向量的矩阵。由于您表示您希望列对应不同的X
值,而行对应不同的Y
值,因此我们需要length(X)
列和length(Y)
行,因此我'我们为length(Y)
的{{1}}参数提供了nrow
,剩下的就完成了。matrix()
和each
参数来获取正确的输入向量。为了实现这一目标,我们必须知道,默认情况下,times
有效地首先在行中布置基础向量,然后只有跨列(注意:我使用单词跨而不是沿着,所以当我说跨行时,你应该看到它向下沿着一栏)。这意味着我们在重复matrix()
时重复times
和Y
时需要each
。基于expand.grid()
和with()
的替代方案:
X