Предыдущие ответы верны, но есть и вопрос эффективности:
sum([x[k]*base^(k-1) for k=1:length(x)])
собирает числа в массив перед суммированием, что вызывает ненужные выделения. Пропустите скобки, чтобы получить лучшую производительность:
sum(x[k]*base^(k-1) for k in 1:length(x))
Это также выделяет массив перед суммированием: sum(d.*4 .^(0:(length(d)-1)))
Если вы действительно хотите хорошую производительность, напишите цикл и избегайте повторного возведения в степень:
function undigit(d; base=10)
s = zero(eltype(d))
mult = one(eltype(d))
for val in d
s += val * mult
mult *= base
end
return s
end
Это имеет еще одно ненужное умножение, вы можете попытаться найти способ пропустить это. Но производительность в 10-15 раз лучше, чем у других подходов в моих тестах, и имеет нулевое распределение.
Редактировать: На самом деле небольшой риск для обработки типов выше. Если входной вектор и base
имеют разные целочисленные типы, вы можете получить нестабильность типа. Этот код должен вести себя лучше:
function undigits(d; base=10)
(s, b) = promote(zero(eltype(d)), base)
mult = one(s)
for val in d
s += val * mult
mult *= b
end
return s
end