如何解决为什么两个函数给出不同的结果?
我使用RcppArmadillo
包定义了两个函数,并将它们保存到文件cxxFuns.cpp
中。 f01
和f02
之间的唯一区别是V(0,0)
的位置:
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::export]]
arma::mat f01 (arma::mat x) {
unsigned int p0 = x.n_cols ;
unsigned int iR = 0,iC = 0 ;
arma::mat V(3,3) ; V.fill(NA_REAL) ;
for (iR = 0; iR < p0; iR++) {
V(0,0) = arma::sum(x.col(iR) % x.col(iR)) ;
for (iC = iR+1; iC < p0; iC++) {
;
}
}
return V ;
}
// [[Rcpp::export]]
arma::mat f02 (arma::mat x) {
unsigned int p0 = x.n_cols ;
unsigned int iR = 0,3) ; V.fill(NA_REAL) ;
for (iR = 0; iR < p0; iR++) {
for (iC = iR+1; iC < p0; iC++) {
V(0,0) = arma::sum(x.col(iR) % x.col(iR)) ;
}
}
return V ;
}
据我了解,函数f01
和f02
应该给出相同的结果。但是,测试未显示预期结果。
rm(list=ls())
set.seed(2020)
Rcpp::sourceCpp('cxxFuns.cpp')
x <- matrix(rnorm(100*10),10)
(egg01 <- f01(x))
[,1] [,2] [,3]
[1,] 12.78607 NA NA
[2,] NA NA NA
[3,] NA NA NA
(egg02 <- f02(x))
[,] 14.80855 NA NA
[2,] NA NA NA
发生了什么事?
解决方法
第一个块中的最后一次执行是在iR = p0-1
时。
第二个块中的最后一次执行是iC=p0-1
时。
由于iC
以iR+1
开头,因此您最后一次执行的是iR=p0-2
。
在计算iR
或在调试器下运行之前打印V(0,0)
的值应该立即使这一点变得清楚。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。