有人知道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'语句对于大向量来说太慢了。
答案 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
希望这会有所帮助!