如何为多元函数创建所有函数值的矩阵
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)
,剩下的由它完成。
- 我们必须小心确保我们为正确的输入向量使用了
each
和 times
参数。为了做到这一点,我们必须知道,默认情况下,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));
在 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)
,剩下的由它完成。 - 我们必须小心确保我们为正确的输入向量使用了
each
和times
参数。为了做到这一点,我们必须知道,默认情况下,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));