使用其他向量中的相应元素更改 arma::vec 中给定位置的元素
Posted
技术标签:
【中文标题】使用其他向量中的相应元素更改 arma::vec 中给定位置的元素【英文标题】:Change elements at given positions in an arma::vec with corresponding elements in other vector 【发布时间】:2016-07-23 12:28:47 【问题描述】:我想知道Rcpp
中最紧凑的语法是什么,可以将向量v1
中位置pos
的给定(非连续)元素更改为另一个向量中的相应元素(如果我使用的是arma::vec
类)?说出我会在 R 中做什么
v1 = 1:10
pos = c(2,4,10)
v2 = c(3,8,2)
v1[pos] = v2
如果不执行明确的for
循环,这是否可能?
抱歉,如果这是一个微不足道的问题...
【问题讨论】:
也许先看看RcppArmadillo subsetting。 我看过那个,但那是关于子集的,而在我的情况下,我不确定是否为选定的元素分配新值......猜猜这很简单,但我是 Rcpp 和 RcppArmadillo 的新手... 【参考方案1】:即使Rcpp Gallery: RcppArmadillo Subsetting 帖子中确实已经回答了这个问题,我也会回答这个问题。
子集操作
在犰狳中,API 有submatrix views 使该操作能够发生。
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec so_subset_params(arma::vec x, arma::uvec pos, arma::vec vals)
// Subset and set equal to
x.elem(pos) = vals;
return x;
/*** R
v1 = 1:10
pos = c(2,4,10)
v2 = c(3,8,2)
so_subset_params(v1, pos-1, v2)
*/
这将给出:
[,1]
[1,] 1
[2,] 3
[3,] 3
[4,] 8
[5,] 5
[6,] 6
[7,] 7
[8,] 8
[9,] 9
[10,] 2
在犰狳中复制 R 代码
要在犰狳中 100% 复制您的示例,请使用:
// [[Rcpp::export]]
void so_subset()
// --------------- 1:10
arma::vec v1 = arma::linspace(1,10,10);
Rcpp::Rcout << "Initial values of V1:" << std::endl << v1 << std::endl;
// --------------- pos=c(2,4,10)
// One style to create a subset index
arma::uvec pos(3);
pos(0) = 2; pos(1) = 4; pos(2) = 10;
Rcpp::Rcout << "R indices pos:" << std::endl << pos << std::endl;
// Adjust for index shift R: [1] => Cpp: [0]
pos = pos - 1;
Rcpp::Rcout << "Cpp indices pos:" << std::endl << pos << std::endl;
// --------------- v2 = c(3,8,2)
// C++98
arma::vec v2;
v2 << 3 << 8 << 2 << arma::endr;
// C++11
// arma::vec v2 = 3, 8, 2; // requires C++11 plugin
Rcpp::Rcout << "Replacement values v2:" << std::endl << v2 << std::endl;
// --------------- v1[pos] = v2
// Subset and set equal to
v1.elem(pos) = v2;
Rcpp::Rcout << "Updated values of v1:" << std::endl << v1 << std::endl;
/*** R
so_subset()
*/
因此,您将获得以下与每个操作相关的输出。
Initial values of V1:
1.0000
2.0000
3.0000
4.0000
5.0000
6.0000
7.0000
8.0000
9.0000
10.0000
R indices pos:
2
4
10
Cpp indices pos:
1
3
9
Replacement values v2:
3.0000
8.0000
2.0000
Updated values of v1:
1.0000
3.0000
3.0000
8.0000
5.0000
6.0000
7.0000
8.0000
9.0000
2.0000
【讨论】:
非常感谢您的详细解释!这太妙了!再次为这个可能微不足道的问题道歉 - 我这周才开始了解 Rcpp!以上是关于使用其他向量中的相应元素更改 arma::vec 中给定位置的元素的主要内容,如果未能解决你的问题,请参考以下文章
(Rcpp, armadillo) 将 arma::vec 转换为 arma::mat
如何使用 SWIG 在 C++ 中调用 python 函数?