【问题标题】:Custom tcrossprod function in RR中的自定义tcrossprod函数
【发布时间】:2014-09-10 10:35:03
【问题描述】:

我在 R 中的矩阵上使用tcrossprod 函数。它对我的数据及其转置进行了叉积。即数据 %*% t(data)。

问题是,我不希望单个操作(数据中的行和 t(data) 中的列之间)是乘法操作。是否可以在其中指定我自己的函数,以便实现相同的算法,但它会执行其他操作而不是乘法。

我现在通过遍历矩阵并执行所需的操作来实现相同的结果,但是循环使这种方法变慢。

这是我目前正在做的事情(但将 * 操作替换为其他内容):

count<-nrow(data)
output<-sapply(1:count, function(x){
        sapply(1:count, function(y){
                sum((data[x,]+data[y,])*abs(data[x,]-data[y,]))
            })
    })

任何帮助将不胜感激。

【问题讨论】:

  • 你能展示你平移使用什么功能吗?是否可以矢量化可以帮助我们为您提供快速运行的解决方案。
  • 感谢@flodel,做到了。
  • 这没有帮助。我们想知道 "something else" 是什么样的。没有它,(慢)一般答案是像你一样做一个双循环。
  • 感谢@flodel,添加了所需的操作。
  • 我很感兴趣:您能否提供一些关于您正在分析的情况的背景信息,即两个矩阵上的交叉“函数”操作如何/为什么提供有用的信息?

标签: r matrix-multiplication cross-product


【解决方案1】:

这将用更快的矩阵运算替换您的慢速 sapply 循环之一:

sapply(1:count, function(i, x) {
   colSums((x + x[, i]) * abs(x - x[, i]))} , x = t(data))

为了加快速度,请将sapply 替换为vapply

vapply(1:count, function(i, x) {
   colSums((x + x[, i]) * abs(x - x[, i]))} , numeric(count), x = t(data))

如果这对您来说仍然太慢,那么很可能使用 Rcpp 解决方案。否则,我看不到比这更快的纯基础解决方案(不过我很高兴被证明是错误的。)

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2019-12-16
    • 2018-12-21
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多