Julia:使用基数n将向量转换为数字

3
我需要一个函数,它可以将整数向量解释为具有特定进制的数字,就像这样:
vectonum([1,2,3,4], 10) #=> 1234
vectonum([0,0,0,1], 2) #=> 1
vectonum([1,1,1,1], 2) #=> 15

以下函数可以完成任务,但在我看来有些笨拙:
function vectonum(vector, base)
  result = 0
  vector = reverse(vector)
  for (idx, val) in enumerate(vector)
    val_ = val * base ^ (idx - 1)
    result += val * base ^ (idx - 1)
  end
  return result
end


有没有更好的、更具Julia风格的方法来完成这个任务,或者甚至有一个内置的函数或模块可以实现这个功能呢?
提前感谢!
2个回答

6

你可以写:

f(v, b) = foldl((x,y) -> b*x+y, v)

这可能是最简短和快速的方法。如果您希望它也适用于返回0的空向量,请在调用中将其更改为foldl((x,y) -> b * x + y,v,init = 0)

我还想到了一些其他替代方案,因此我在下面发布它们。

首先相对较短(但不快)的方法是:

f(v, b) = parse(Int, join(v), base=b)

你的实现方式可能是这样的:

f(v, b) = sum(x -> b^(x[1]-1)*x[2], enumerate(Iterators.reverse(v)))

2
你写的代码风格很符合Julia规范,只是你选择了稍微低效的算法。最好避免使用指数运算,因为这里计算 b^nb^(n+1) 的重复工作非常浪费时间和性能,所以不建议使用。以下是一种基本上与 @BogumilKaminski 的第一个解决方案相同的实现方法,只是使用了循环(循环是Julia风格),并且比使用foldl略微更快:
function vectonum(d, base=10)
   s = zero(eltype(d))
   for val in d
      s = s * base + val
   end
   return s
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接