加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

矢量化插入元素

发布时间:2020-12-15 04:09:06 所属栏目:Java 来源:网络整理
导读:我编写了一个R函数插入,用于在向量v的给定位置p处插入给定元素e. 这里是: insert - function(v,e,p) { if (length(e) != 1 || length(p) != 1) { stop('supported the insertion of only one element per call.') } len - length(v) nms - names(v) enm - n
我编写了一个R函数插入,用于在向量v的给定位置p处插入给定元素e.

这里是:

insert <- function(v,e,p) {
  if (length(e) != 1 || length(p) != 1) {
    stop('supported the insertion of only one element per call.')
  }
  len <- length(v)
  nms <- names(v)
  enm <- names(e)
  res <- NULL
  if (p > 1 && p <= len) {
    res <- c(v[1:(p-1)],v[p:len]) # insert
  } else if (p == 1) {
    res <- c(e,v) # prepend 
  } else if (p == (len+1)) {
    res <- c(v,e) # append
  } else {
    stop('wrong position')
  }
  if (!is.null(enm)) {
      names(res) <- insert(nms,enm,p)
  }
  res
}

请注意,此函数与R中的几乎所有内容一样,返回一个新向量.另外(参见递归调用),它还插入元素的名称(如果有的话).

这是一个简单的使用示例:

a <- c(1,2,3,4,5,7,8,10)
names(a) <- c(letters[1:5],letters[7:8],letters[10])
a
# a  b  c  d  e  g  h  j 
# 1  2  3  4  5  7  8 10  
b <- c(9)
names(b) <- letters[9]
insert(a,b,8)
# a  b  c  d  e  g  h  i  j 
# 1  2  3  4  5  7  8  9 10

我正在尝试编写此函数的矢量化(高效)版本.

现在,我写了一个优雅的解决方案:

vinsert <- function(v,elems,positions) {
  out <- v
  for (i in 1:length(elems)) {
    out <- insert(out,elems[i],positions[i])
  }
  out
}

这里有一个简单的使用示例:

a <- c(1,letters[10])
a
# a  b  c  d  e  g  h  j 
# 1  2  3  4  5  7  8 10
z <- c(6,9)
names(z) <- c(letters[6],letters[9])
z
# f  i
# 6  9
vinsert(a,z,z)
# a  b  c  d  e  f  g  h  i  j 
# 1  2  3  4  5  6  7  8  9 10

所以,我正在考虑的两个函数(插入和vinsert)的问题是:

>返回一个新的向量或修改向量并返回它?
>用Rcpp写一个等效的函数?
>可以使用一阶R函数编写等效函数吗?

任何建议,帮助或更优雅和有效的解决方案?提前致谢.

解决方法

似乎存在许多问题,例如,插入顺序如何受先前插入的影响,以及插入多于一个元素的序列时该怎么做.这里我们有一个原始序列

x <- letters[1:10]

以及我们想要插入的一些内容

v <- LETTERS[1:4]

我们想要插入它们的位置

at <- c(4,6)

进行插入的一种方法是计算新索引值相对于原始值的顺序;订单提供稳定的订单

o <- order(c(seq_along(x),at))

然后进行插入

> c(x,v)[o]
 [1] "a" "b" "C" "c" "d" "A" "e" "f" "D" "g" "B" "h" "i" "j"

插入规则与原始插入规则不完全相同

> o = order(c(seq_along(a),z))
> c(a,z)[o]
 a  b  c  d  e  g  f  h  j  i 
 1  2  3  4  5  7  6  8 10  9

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读