如何将外层推广到n维?
标准 R 表达式 outer(X, Y, f)
计算出一个矩阵,其第 (i, j) 个条目的值为 f(X[i], Y[j])
。
我想实现函数 multi.outer
,它是 outer
的 n 维概括: multi.outer(f, X_1, ..., X_n)
,其中 f 是某个 n 元函数,将生成一个 (length(X_1) * ... * length(X_n)) 数组,其第 (i_1,...,i_n) 个条目的值为对于所有有效索引集 (i_1,...,i_n),f(X_1[i_1], ..., X_n[i_n])
。显然,对于 {1, ..., n} 中的每个 i,multi.outer(f, X_1,...,X_i,..., X_n)
必须是函数 f
允许的第 i 个参数。对于 n=2 的情况,multi.outer
会执行与 outer
相同的操作,尽管它会有不同的签名 (IOW, multi.outer(f , X, Y)
等价于 outer(X, Y, f)
)。
需要注意的是,虽然 multi.outer
的参数 X_1, ..., X_n 都是向量,但它们不一定都具有相同的模式。例如,X_1 和 X_2 可以分别是 c(1, 2, 3)
和 LETTERS[10:20]
。
谢谢!
The standard R expression outer(X, Y, f)
evaluates to a matrix whose (i, j)-th entry has the value f(X[i], Y[j])
.
I would like to implement the function multi.outer
, an n-dimensional generalization of outer
: multi.outer(f, X_1, ..., X_n)
, where f is some n-ary function, would produce a (length(X_1) * ... * length(X_n)) array whose (i_1,...,i_n)-th entry has the value f(X_1[i_1], ..., X_n[i_n])
for all valid index sets (i_1,...,i_n). Clearly, for each i in {1, ..., n}, all the elements of X_i
in multi.outer(f, X_1,...,X_i,..., X_n)
must be allowable i-th arguments for the function f
. For the case n=2, multi.outer
would do the same thing as outer
, although it would have a different signature (IOW, multi.outer(f, X, Y)
would be equivalent to outer(X, Y, f)
).
It is important to note that, although the arguments X_1, ..., X_n of multi.outer
are all vectors, they don't necessarily all have the same mode. E.g. X_1 and X_2 could be c(1, 2, 3)
and LETTERS[10:20]
, respectively.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是一种方法:首先使用
Vectorize
和outer
定义一个函数,该函数创建一个 n 维矩阵,其中每个条目都是给定函数将在其上的参数列表应用:现在
multi.outer
只需要在此“args-matrix”上调用apply
和do.call
:让我们通过一个示例来尝试一下功能:
This is one way: First use
Vectorize
andouter
to define a function that creates an n-dimensional matrix where each entry is a list of arguments on which the given function will be applied:Now
multi.outer
just needs to invokeapply
anddo.call
on this "args-matrix" :Let's try this with an example function:
这个怎么样:
How about this:
我认为我们可以使用 Outer 和 Vectorize 来做到这一点。
现在,sigm1(x=1:3) 给出了所需的输出。
此代码片段的唯一缺点是我使用 a=-1:1 和 b=-1:1 的默认值。当我尝试在函数调用期间传递相同的内容时,它会变得混乱。例如,
我无法弄清楚为什么传递参数会导致输出出现这种差异。
I think we can do this using Outer and Vectorize.
Now, sigm1(x=1:3) gives the required output
The only draw back with this code snippet is I am using the default values of a=-1:1 and b=-1:1. When I try to pass the same during function calling, it goes haywire. E.g.
I am unable to figure out why passing the arguments is making this difference in output.