Распределение векторов arma с гибким размером - верно вообще или является свойством Rcpp?
-
21-12-2019 - |
Вопрос
Я использую пакет Rcpp для написания кода, основная доля которого написана на C ++, а меньшая - на R.
Основываясь на том, что я знаю из C ++, в отличие от R, все переменные в C ++ должны быть объявлены заранее, и это объявление включает как тип, так и размер.Например , когда мы говорим:
arma::vec test(2);
тогда я предполагаю, что test - это вектор armadillo размером 2, что означает, что мы не должны назначать что-либо другого размера для тестирования.Это правда?
Вот мой вызов:
В моем коде у меня есть цикл, который присваивает векторы разного размера (обычно больше 2) "тестовому вектору" без повторное объявление теста .К моему удивлению, код работает совершенно нормально, без каких-либо ошибок компиляции!
На каждой итерации вот как я назначаю новый вектор для тестирования:
test = Rcpp::as<arma::vec>(myList["aVecFromMyList"]);
Вопрос:
Это особенность Armadillo, которой мы можем назначать векторы разной длины для тестирования, которые изначально объявлены размером 2?или это функция пакета Rcpp?
Большое спасибо за вашу помощь.
Решение
Вы запрашиваете размер вектора, который должен быть закодирован в Тип.Когда вы указываете, что что-то имеет тип arma::vec
, вы позволяете ему принимать arma::vec
s любого размера.
Если вы хотите применить ограничение размера в типе, то вам нужно что-то вроде arma::vec::fixed<N>
, где в вашем случае N
было бы 2.Это тип, который применяет ограничение на то, что векторы должны иметь размер N
.Существуют также typedefs для их версий с низким значением, например vec2
как фиксированный вектор размером 2.
Вам пришлось бы изменить свой as
вызывайте аналогично, я верю - надеюсь, это сработает, я это не тестировал.
Вам следует прочитать Документы броненосца;документы Armadillo, вероятно, одни из самых чистых и полезных в мире.