Nim中的R样式逻辑向量运算

时间:2018-10-31 13:12:14

标签: vectorization nim

有人知道Nim是否在R中具有像'ifelse'这样的函数,该函数允许对向量应用条件计算,等效于:

a<-c(1,2,3,4)
b<-c(7,2,7,4)
c<-ifelse(a==b,a*b,a+b)

使用循环和'if,else'语句对于大向量来说太慢了。

1 个答案:

答案 0 :(得分:1)

好的。在Nim中,元组使用与R中的向量相同的思想:structural typing。希望我在这里走上正轨。 Nim具有在编译时(而不是运行时)进行处理的能力,因此为Tuples内置的函数(例如==)在其源代码中具有一个循环,但实际上,该循环在编译时正在分解,并且在运行时直接引用了这些字段。因此,对于速度而言,Tuple == Tuple将尽可能快,而与Tuple中的字段数无关。可以通过source code进行验证。

我确信您可以验证我编写的这个小功能,因为*并不是为Tuples内置的,您可以按照您的要求进行操作。

let
  v1 = (1,2,3,4)
  v2 = (7,2,7,4)

proc `*`[T:tuple](x, y: T): T =
  for a,b in fields(x, result):
    b = a
  for a,b in fields(y, result):
    b = b * a

echo $(v1 * v2) #prints (Field0: 7, Field1: 4, Field2: 21, Field3: 16)

我们可以编写相同的函数进行加法:

let
  v1 = (1,2,3,4)
  v2 = (7,2,7,4)

proc `+`[T:tuple](x, y: T): T =
  for a,b in fields(x, result):
    b = a
  for a,b in fields(y, result):
    b = b + a

echo $(v1 + v2)

这是一个完整的示例,它是forum convo和以上功能的组合:

proc `+`[T:tuple](x, y: T): T =
  for a,b in fields(x, result):
    b = a
  for a,b in fields(y, result):
    b = b + a

proc `*`[T:tuple](x, y: T): T =
  for a,b in fields(x, result):
    b = a
  for a,b in fields(y, result):
    b = b * a

let
  a = (1,2,3,4)
  b = (7,2,7,4)
  c = if v1 == v2: v1 * v2 else: v1 + v2

希望这会有所帮助!