Операция логического вектора в стиле R в Nim

Кто -нибудь знает, есть ли в Nim функция типа ifelse в R, которая позволяет применять условные вычисления к векторам, эквивалентную:

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

использование цикла и оператора if, else будет слишком медленным для больших векторов.

1 ответ

Итак. В Nim Tuple использует ту же идею, что и вектор в R: структурная типизация. Надеюсь, я здесь. Nim имеет возможность делать вещи во время компиляции, а не во время выполнения, поэтому функции, встроенные в Tuples, такие как == есть цикл в их исходном коде, но на самом деле цикл разворачивается во время компиляции, и на поля ссылаются непосредственно во время выполнения. Так что для скорости Tuple == Tuple будет настолько быстрым, насколько это возможно, независимо от количества полей в Tuple. Это можно проверить с помощью исходного кода.

Я уверен, что вы можете сделать именно то, что вы просите, проверив, что эта маленькая функция, которую я написал, работает с * не был построен для 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)

Вот полный пример, который представляет собой комбинацию форума 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

Надеюсь это поможет!

Другие вопросы по тегам