В соответствии с комментарием ОП относительно следующего шага после разностных столбцов будет более компактно, если вы также возведете в квадрат и суммируете итоговые значения столбцов во время вычисления, так что в результате вы получите только вектор с 13 125 элементами вместо сохранения13,125 * 90 * 90 числовых вычитаемых значений.Быстрый и возможный подход заключается в использовании RcppArmadillo
:
colpairs.cpp
(отнюдь не единственная реализация):
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
rowvec colpairs(mat Z) {
unsigned int i, j, k = Z.n_cols;
colvec vi, vj, y;
rowvec res(k);
for (i=0; i<k; i++) {
vi = Z.col(i);
res[i] = 0;
for (j=0; j<k; j++) {
vj = Z.col(j);
y = vi - vj;
res[i] += as_scalar(y.t() * y);
}
}
return res;
}
В R:
library(Rcpp)
library(RcppArmadillo)
sourceCpp("colpairs.cpp")
# #use a small matrix to check results
# set.seed(0L)
# nc <- 3; nr <- 3; M <- matrix(rnorm(nr*nc), ncol=nc)
# c(sum((M[,1]-M[,2])^2 + (M[,1]-M[,3])^2), sum((M[,3]-M[,2])^2 + (M[,2]-M[,3])^2), sum((M[,3]-M[,1])^2 + (M[,2]-M[,3])^2))
# colpairs(M)
set.seed(0L)
nc <- 13125
nr <- 90
M <- matrix(rnorm(nr*nc), ncol=nc)
colpairs(M)
TRUNC.вывод:
[1] 2105845 2303591 2480945 2052415 2743199 2475948 2195874 2122436 2317515 .....