如何为多变量函数创建所有函数值的矩阵

时间:2016-04-04 21:17:55

标签: r function normal-distribution

在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函数可以以智能方式使用,但我不确定如何使用。

感谢您的帮助!

1 个答案:

答案 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()时重复timesY时需要each

基于expand.grid()with()的替代方案:

X