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

How to create matrix of all function-values for multivariate functions

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

感谢您的帮助!

这可以被矢量化:

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)的相同长度。我们当然必须交错重复的值,这样我们就可以得到 xi、yj 的每个组合。为此,我们必须对其中一个 rep() 调用使用 each 参数,对另一个调用使用 times 参数(没有显式名称的默认值)。
  • 对两个重复向量(具有常量 σ)调用 dnorm() 会生成上述长度的向量,其中包含线性形式的所需输出值。
  • 我们最终必须通过调用 matrix() 从该向量构建一个矩阵。由于您表示希望列对应于不同的 X 值,行对应于不同的 Y 值,因此我们需要 length(X) 列和 length(Y) 行,因此我'已经为 matrix()nrow 参数提供了 length(Y),剩下的由它完成。
  • 我们必须小心确保我们为正确的输入向量使用了 eachtimes 参数。为了做到这一点,我们必须知道,默认情况下,matrix() 有效地首先 跨行 布局基础向量 跨列 ](注意:我使用 across 这个词而不是 along,所以当我说 across rows您应该将其可视化为 沿着 一列向下移动)。这意味着我们需要在重复Y时使用times,在重复X时使用each

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

matrix(with(expand.grid(Y=Y,X=X),dnorm(X,Y,1)),length(Y));