Повторяющиеся значения в Юлии с функцией - PullRequest
4 голосов
/ 16 января 2020

Мне нужно написать функцию, которая принимает в качестве входных данных

a = [12,39,48,36]

и выдает в качестве выходных данных

b=[4,4,4,13,13,13,16,16,16,12,12,12]

, где идея состоит в том, чтобы повторить один элемент три или два раза (это должно быть переменным) и делится на 2 или 3.

Я пытался сделать это:

c=[12,39,48,36]
a=size(c)
for i in a 
    repeat(c[i]/3,3)
end

Ответы [ 2 ]

6 голосов
/ 16 января 2020

Вам необходимо векторизовать оператор деления с точкой .. Кроме того, я понимаю, что вы хотите, чтобы результаты были Int - вы также можете векторизовать приведение к Int:

repeat(Int.(a./3), inner=3)
4 голосов
/ 16 января 2020

Пшемыславский ответ , repeat(Int.(a./3), inner=3) превосходен, и именно так вы должны написать свой код для краткости и ясности. Позвольте мне в этом ответе проанализировать ваше попытанное решение и предложить пересмотренное решение, которое сохраняет ваши намерения. (Я считаю, что это часто полезно в образовательных целях).

Ваш код:

c = [12,39,48,36]
a = size(c)
for i in a 
    repeat(c[i]/3, 3)
end

Немедленное исправление:

c = [12,39,48,36]
output = Int[]
for x in c
    append!(output, fill(x/3, 3))
end

Вот изменения Я сделал:

  • Вам нужен массив для фактического хранения вывода. Функция repeat, которую вы используете в l oop, даст результат, но этот результат будет отброшен! Вместо этого мы определяем изначально пустой output = Int[], а затем append! каждый повторяющийся блок.
  • Ваша for l oop спецификация выполняет итерацию по кортежу размера (4,), который генерирует только одно число 4. (Возможно, вы неправильно понимаете назначение функции size: она в первую очередь полезна для многомерных массивов.) Чтобы исправить это, вы можете сделать a = 1:length(c) вместо a = size(c). Но на самом деле вам не нужен индекс i, вам нужны только элементы x из c напрямую, поэтому мы можем упростить l oop до for x in c.
  • Наконец, repeat предназначен для массивов. Он не работает для одного скаляра (это, вероятно, ошибка, которую вы видите); Вы можете использовать более подходящий fill(scalar, n), чтобы получить [scalar, ..., scalar].
...