【问题标题】:Rccp loop function does not dicard old valuesRccp 循环函数不会丢弃旧值
【发布时间】:2019-01-30 10:40:41
【问题描述】:

我正在 Rccp 和 Rcpparmadillo 中开发一个交叉验证循环。相同的循环在 R 中完美运行。问题是在 Rcpp 中循环的旧值没有被丢弃。下面是一个非常简化的代码。 frmwC 是一个大的 Rcpparmadillo 函数,当迭代次数为 1(nR)时,它与 R 相同的函数给出相同的结果,但是当 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 丢弃循环中的先前值并仅保留最后一个值? 我的交叉验证更复杂,我不能只将值除以迭代次数。 谢谢你

【问题讨论】:

  • 这不会显示Minimal, Complete, and Verifiable Example(另请参阅How to create a great R reproducible example - 其中一些将适用于您)。当我们不知道您的函数或数据是什么样子时,其他人很难为您提供帮助。
  • frmwc 是一个大函数,它本质上执行 PLS,最后生成一个包含 17 个元素的列表,其中大部分是犰狳类。我根本不熟悉 C++,我想知道 for 循环的先前元素是否在内存中分配并添加到新值中,以及我们如何避免它。数据只是随机数。
  • 错误:“subset_mat”未在此范围内声明;错误:未在此范围内声明“frmwC”。很难用不可重现的例子来帮助你

标签: r rcpp armadillo


【解决方案1】:

我终于解决了问题出在声明矩阵初始化的 frmwC 函数中。最初,我没有声明初始值,这导致了问题。现在我声明了一个初始值,一切都按预期工作(检查下面的代码脚本。 但是我不确定为什么会发生这种情况。如果有人能详细说明就完美了

mat T = zeros(X.n_rows, A), P = zeros(X.n_cols, A), V = P, W = P,
    B = zeros(X.n_cols, Y.n_cols), Q = zeros(Y.n_cols, A), 
    Ys = zeros(X.n_rows, A-1),
    Yts = zeros(Xt.n_rows, A), Si = zeros(X.n_cols, X.n_cols), 
    Bt = zeros(X.n_cols, A),Xi = zeros(X.n_cols, X.n_rows),
    Res = zeros(A, 6), Cor = zeros(A,1);

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多