3

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

问题是,我不希望单个操作(数据中的行和 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,]))
            })
    })

任何帮助将非常感激。

4

1 回答 1

2

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

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

为了让它更快一点,请替换sapplyvapply

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

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

于 2014-09-10T11:37:55.777 回答