Хорошо, с новой версией Armadillo 9.870, теперь есть лучший способ сделать это. Улучшение скорости невелико, особенно на маленьких матрицах, но оно выглядит последовательным. Что еще более важно, код намного короче.
Я вызываю новую функцию trimat2vec_new
.
vec trimat2vec_new(mat const& inmat){
return(inmat.elem(trimatl_ind(size(inmat),-1)));
}
Простой тест в R:
a=matrix(1:900,30,30)
all(trimat2vec_new(a) == trimat2vec(a))
library(microbenchmark)
microbenchmark(trimat2vec_new(a),
trimat2vec(a),
times = 1000)
приводит к:
Unit: microseconds
expr min lq mean median uq max neval cld
trimat2vec_new(a) 3.026 3.4060 3.633960 3.557 3.727 20.549 1000 a
trimat2vec(a) 3.116 3.6515 3.955116 3.787 3.958 42.981 1000 b
Мне особенно нравится удобство новой функции trimatl_ind
. И небольшое улучшение скорости.