Я разрабатываю цикл перекрестной проверки в Rccp и Rcpparmadillo.Тот же цикл отлично работает в R. Проблема в том, что в Rcpp старые значения цикла не отбрасываются.Ниже приведен очень упрощенный код.FrmwC - это большая функция Rcpparmadillo, которая дает те же результаты с той же функцией R, когда число итераций равно 1 (nR), но когда nR больше, предыдущие значения добавляются к новому, но я хочу оставить только последниеодин, как это происходит в R. frmwC экспортирует результаты в виде списка
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export()]]
mat mult(const mat& X,const mat& Y, const mat& Xt, IntegerVector idx, int A, int nR)
{
uvec idx1 = as<uvec>(idx);
List model;
NumericMatrix Yc1;
for (int i = 0; i <nR; i++)
{
mat X0 = X.rows(idx1);
mat Y0 = Y.rows(idx1);
mat X1 = subset_mat(X, idx);
mat Y1 = subset_mat(Y, idx);
// Rcout << X0;
model = frmwC(X1,Y1,X0, A = A);
}
mat Yc = as<mat>(model("predYt"));
return Yc;
}
Ниже приведены результаты для nR = 1
X = matrix(runif(100, 1, 100),10,10)
Y = matrix(round(runif(10,1,100)))
Xt = matrix(runif(50,1,100),5,10)
Yt = matrix(round(runif(5, 1,100)))
idx = sample(size = 5, 0:9)
A = 10; nR = 1; nG = 2; Ix = matrix(0, A, ncol(X) + 1)
mult(X = X, Y = Y, Xt, idx = idx, A = A, nR = nR)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 61.28675 80.15003 76.19408 73.11867 72.55760 0 0 0 0 0
[2,] 48.45832 43.98474 36.04582 33.73255 32.79945 0 0 0 0 0
[3,] 35.35432 32.30002 37.16849 39.35326 39.58430 0 0 0 0 0
[4,] 54.93001 48.29227 44.68769 53.29742 53.36127 0 0 0 0 0
[5,] 52.17147 64.95472 65.61675 76.79194 75.09447 0 0 0 0 0
Результаты для nR = 10
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 714.3052 733.1685 729.2125 726.1371 725.5760 0 0 0 0 0
[2,] 343.6533 339.1798 331.2408 328.9276 327.9945 0 0 0 0 0
[3,] 391.6130 388.5587 393.4271 395.6119 395.8430 0 0 0 0 0
[4,] 535.1815 528.5437 524.9391 533.5489 533.6127 0 0 0 0 0
[5,] 728.0217 740.8049 741.4669 752.6421 750.9447 0 0 0 0 0
И с использованием версии кода R
X0 = X[(idx+1),]
Y0 = Y[(idx+1),,drop = F]
X1 = X[-(idx+1),]
Y1 = Y[-(idx+1),,drop = F]
for (i in 1:10) {
testR = frmwR(X = X1,Y = Y1, Xt = X0, Ix = Ix,A = A,Iss = Iss)
}
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 61.28675 80.15003 76.19408 73.11867 72.55760 0 0 0 0 0
[2,] 48.45832 43.98474 36.04582 33.73255 32.79945 0 0 0 0 0
[3,] 35.35432 32.30002 37.16849 39.35326 39.58430 0 0 0 0 0
[4,] 54.93001 48.29227 44.68769 53.29742 53.36127 0 0 0 0 0
[5,] 52.17147 64.95472 65.61675 76.79194 75.09447 0 0 0 0 0
Пока idx одинаков, все значения независимо от того, итерации должны быть одинаковыми.Как я могу сделать Rcpp, чтобы отбросить предыдущие значения из цикла и сохранить только последние?Моя перекрестная проверка более сложна, и я не могу просто разделить значения на количество итераций.Огромное спасибо