c++ - 如何做矩阵* vector 乘法并将结果传递给R中TMB中的 vector ?

标签 c++ r rcpp tmb

我需要做一个矩阵* vector 乘法,它仅生成一个数字,并将其传递给 vector (但在下面的注释代码中不起作用)。到目前为止,我有:

cpp代码

#include <TMB.hpp>
template<class Type>
Type objective_function<Type>::operator() ()
{
  DATA_MATRIX(U); // id x 2 matrix
  DATA_MATRIX(Z); // n x 2 matrix
  matrix<Type> Z1_m1 = matrix<Type>(Z.row(0))*vector<Type>(U.row(0));
  REPORT(Z1_m1); // works
  vector<Type> ZZ(6);
  // ZZ(0) = matrix<Type>(Z.row(0))*vector<Type>(U.row(0)); // HOW TO FIX IT??
  // (This is a small code, which the real application run inside a for loop, and the row indices will be given by for)
  REPORT(ZZ);
  return 0;
}

R代码
require(TMB)
set.seed(232)
model_data = list(U = matrix(c(9,11,2,4), ncol = 2),
                  Z = matrix(c(1,2,3,4,5,6, rpois(6,2)), ncol=2))
model <- "mult"
compile(paste0(model, ".cpp"))
dyn.load(dynlib(model))
m1 = MakeADFun(data=model_data, parameters=list(),type="Fun",
                  checkParameterOrder=FALSE,DLL=model)
print(m1$report())  # Note: order of variables NOT the same as .cpp file

有什么帮助吗?

我已经将此问题发布到TMB users group中。如果解决方案首先出现在这里,我将在此处发布。

最佳答案

我将在TMB Users group中@Bob帮助后发布我的解决方案:

#include <TMB.hpp>
template<class Type>
Type objective_function<Type>::operator() ()
{
  DATA_MATRIX(U); // id x 2 matrix
  DATA_MATRIX(Z); // n x 2 matrix
  vector<Type> ZZ(6);
  // ZZ(0) = (Z.row(0).array()*U.row(0).array()).sum();
  REPORT(ZZ);
  return 0;
}

这是低效率的,因为它是数组元素的乘法。如果是矩阵,乘法将运行得更快。

关于c++ - 如何做矩阵* vector 乘法并将结果传递给R中TMB中的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61600152/

相关文章:

c++ - 为什么 -fsanitize=undefined 导致 "undefined reference to typeinfo"?

c++ - Unordered_map 在访问元素时有奇怪的行为

r - 计算每组的完整个案

R中树列表结构的递归映射

c++ - 在 Windows 上,libusb 看不到某些端口

c++ - 获取最后执行的 return 语句的行

r - 使用 sum 对数据进行分类的 Case_when 问题 - R/dplyr 解决方案

c++ - 为什么我的 Rcpp 代码比 glmnet 慢得多?

在 Winbuild 上编译 R 包时出现 C++ 编译错误

r - RcppArmadillo 中的 QR 分解