Как выполнить умножение матрицы на вектор и передать этот результат вектору в TMB в R? - PullRequest
1 голос
/ 04 мая 2020

Мне нужно выполнить матричное * векторное умножение, которое генерирует только одно число и передает его в вектор (но это не работает в закомментированном коде ниже). У меня пока есть:

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

Любой help?

Я уже задавал этот вопрос в группе пользователей TMB . Если решение появится первым там, я опубликую его здесь.

1 Ответ

0 голосов
/ 05 мая 2020

Я опубликую здесь свое решение после помощи @Bob в группе пользователей TMB :

#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;
}

Это неэффективно, потому что это поэлементное умножение массива. Если бы это было матричное умножение, работало бы быстрее.

...