R 求两值间两两最大值矩阵的有效方法

R 求两值间两两最大值矩阵的有效方法,r,matrix,dplyr,rcpp,R,Matrix,Dplyr,Rcpp,我想创建一个矩阵,它为条目I,j返回D[I,1]和D[j,1]之间的最大值 我有一个数字向量,在MWE中可以简化为: set.seed(10) n <- 2000 D <- matrix(runif(n,0,100), ncol=1) 它的工作原理几乎完美无瑕,但我确信有一种有效的方法可以使用BaseR,而我没有看到。在BaseR中,我会这样做 D2 <- drop(D) X2 <- outer(D2, D2, pmax) D2以R为基数,我会这样做 D2 <

我想创建一个矩阵,它为条目
I,j
返回
D[I,1]
D[j,1]
之间的最大值

我有一个数字向量,在MWE中可以简化为:

set.seed(10)
n <- 2000 
D <- matrix(runif(n,0,100), ncol=1)
它的工作原理几乎完美无瑕,但我确信有一种有效的方法可以使用BaseR,而我没有看到。

在BaseR中,我会这样做

D2 <- drop(D)
X2 <- outer(D2, D2, pmax)
D2以R为基数,我会这样做

D2 <- drop(D)
X2 <- outer(D2, D2, pmax)

D2从基本R解决方案中删除
sparse
矩阵。这是不必要的矩阵增长。只需使用
矩阵(0,nrow=n,ncol=n)
。Rcpp解决方案将是最快的,因为这需要两个循环。从基本R解决方案中删除
稀疏
矩阵。这是不必要的矩阵增长。只需使用
矩阵(0,nrow=n,ncol=n)
。Rcpp解决方案将是最快的,因为这需要两个循环。很好的一个!213456不错!213456
#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;

// [[Rcpp::export]]
arma::mat pairwise_max(arma::mat x, arma::mat y) {
  // Constants
  int n = (int) x.n_rows;

  // Output
  arma::mat z(n,n);

  // Filling with ones
  z.ones();

  for (int i=0; i<n; i++)
    for (int j=0; j<=i; j++) {
      // Fill the lower part
      z.at(i,j) = std::max(y(i,0), y(j,0));
      // Fill the upper part
      z.at(j,i) = z.at(i,j);
    }

    return z;
}
D2 <- drop(D)
X2 <- outer(D2, D2, pmax)