gpt4 book ai didi

r - 如何将外部尺寸推广到n个尺寸?

转载 作者:行者123 更新时间:2023-12-04 05:21:05 25 4
gpt4 key购买 nike

标准R表达式outer(X, Y, f)计算得出一个矩阵,其第(i,j)个条目的值为f(X[i], Y[j])

我想实现函数multi.outerouter的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,X_imulti.outer(f, X_1,...,X_i,..., X_n)的所有元素必须是f函数的第i个自变量。对于n = 2的情况,multi.outerouter会做相同的事情,尽管它具有不同的签名(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]

谢谢!

最佳答案

这是一种方法:首先使用Vectorizeouter定义一个函数,该函数创建一个n维矩阵,其中每个条目都是将应用给定函数的参数列表:

list_args <- Vectorize( function(a,b) c( as.list(a), as.list(b) ), 
SIMPLIFY = FALSE)


make_args_mtx <- function( alist ) {
Reduce(function(x, y) outer(x, y, list_args), alist)
}

现在 multi.outer只需在此“args-matrix”上调用 applydo.call:
multi.outer <- function(f, ... ) {
args <- make_args_mtx(list(...))
apply(args, 1:length(dim(args)), function(a) do.call(f, a[[1]] ) )
}

让我们用一个示例函数来尝试一下:
fun <- function(a,b,c) paste(a,b,c)

ans <- multi.outer(fun, LETTERS[1:2], c(3, 4, 5), letters[6:7] )

> ans
, , 1

[,1] [,2] [,3]
[1,] "A 3 f" "A 4 f" "A 5 f"
[2,] "B 3 f" "B 4 f" "B 5 f"

, , 2

[,1] [,2] [,3]
[1,] "A 3 g" "A 4 g" "A 5 g"
[2,] "B 3 g" "B 4 g" "B 5 g"

关于r - 如何将外部尺寸推广到n个尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6192848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com