【问题标题】:Using the apply functions to get sum of products of arrays in R使用 apply 函数获取 R 中数组的乘积之和
【发布时间】:2017-09-24 12:52:24
【问题描述】:

假设我有两个三维数组,我想要基于其中一个索引的数组乘积的总和。我想要的是下面示例代码最后一行中的总和。我知道我可以使用循环,但我想以一种有效的方式做到这一点,希望有一些 R 函数可以做这样的事情。任何帮助将不胜感激。

a <- array(1:12, dim=c(3, 2, 2))
b <- array(1, dim=c(3, 2, 2))
a[1, , ] %*% t(b[1, , ]) + a[2, , ] %*% t(b[2, , ]) + a[3, , ] %*% t(b[3, , ])

【问题讨论】:

    标签: arrays r apply mapply tapply


    【解决方案1】:

    除非您确实遇到严重的低效率问题,否则请使用 for 循环。 你不能真正在两个对象上使用内置的 apply。(见评论)

    注意apply isn't guaranteed to be faster than regular for loops

    编辑:由于 cmets:

    Reduce(`+`, lapply(1:dim(a)[1], function(i) a[i, , ] %*% t(b[i, , ])))
    

    是一个潜在的解决方案。虽然我怀疑它比直截了当更有效

    sum <- matrix(0, ncol = dim(a)[2], nrow =  dim(a)[2])
    for (i in 1: dim(a)[1]) sum <- sum + a[i, , ] %*% t(b[i, , ])
    

    我认为它试图做的事情要清楚得多。

    【讨论】:

    • 不,但你可以使用Mapmapply - 但你是对的,速度不会有太大变化。
    • 啊,是的,很抱歉提供错误信息,从未使用过 apply 系列的那一部分。虽然 mapply 可能仍然不能直接适用于此处,并且返回的列表可能具有比效率更高的开销。
    • 可以说它比循环更难阅读,但可行 - Reduce(`+`, Map(function(x,y) a[x,,] %*% t(b[y,,]), seq_len(dim(a)[1]), seq_len(dim(b)[1])))
    • 我认为到那时你还不如Reduce(`+`, lapply(1:dim(a)[1], function(i) a[i, , ] %*% t(b[i, , ])))。我很确定其中至少有一些只是 for 循环的包装器。
    • true - 您应该将其添加为答案 - 看起来很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多