Циклы Julia для доступа к одномерным массивам

Я пытаюсь запустить 2 цикла for для доступа к 2 элементам в массиве (например,)

x = 100
for i in eachindex(x-1)
  for j in 2:x
    doSomething = Array[i] + Array[j]
  end
end

И часто (не всегда) я получаю эту ошибку или аналогичную:

LoadError: BoundsError: attempt to access 36-element Array{Any,1} at index [64]

Я понимаю, что есть правильные способы запуска этих циклов, чтобы избежать ошибок границ, поэтому я использую eachindex(x-1) == 1:x, как бы я сделал это для 2:x?

Я относительно новичок в Юлии, если это не причина ошибки границ, то что это может быть? - Спасибо

РЕДАКТИРОВАТЬ: укороченная версия того, что я пытаюсь запустить (также да, векторные массивы)

all_people = Vector{type_person}() # 1D Vector of type person
size = length(all_people)

... fill vector array to create an initial population of people ...

# Now add to the array using existing parent objects
for i in 1:size-1
  for j in 2:size
    if all_people[i].age >= all_people[j].age # oldest parent object forms child variable
      child = type_person(all_people[i])
    else
      child = type_person(all_people[j])
    end
    push!(all_people, child) # add to the group of people
  end
end

person Adrian Azza    schedule 14.06.2020    source источник
comment
Можете ли вы включить минимальный рабочий пример проблемы? Иначе трудно сказать. Кроме того, индексирование по типу Array сбивает с толку и/или неверно.   -  person StefanKarpinski    schedule 14.06.2020
comment
@StefanKarpinski будет включать пример, не могли бы вы предложить альтернативный метод? Я относительно новичок в этом, так что было бы полезно?   -  person Adrian Azza    schedule 14.06.2020
comment
можете ли вы показать объявление Array ? Этот фрагмент отлично работает для меня   -  person San    schedule 14.06.2020
comment
Похоже, что all_people имеет размер 36, но вы пытаетесь получить доступ к индексу выше этого.   -  person San    schedule 14.06.2020
comment
@San Он пытается получить доступ к позиции 64, а не 37, поэтому не сработает (я тоже пробовал, ха-ха). Я прочитал документацию по Джулии (кратко), и в какой-то момент в ней говорится, что существует правильный способ индексации массивов, о котором я не знаю; (   -  person Adrian Azza    schedule 14.06.2020
comment
Я бы посоветовал вам распечатать и посмотреть значения size и length(all_people) непосредственно перед циклами 2 for, чтобы убедиться, что они одинаковы.   -  person San    schedule 14.06.2020
comment
@San сделал это, и они правы. Я думаю, проблема в том, как Джулия получает индекс массива. Спасибо   -  person Adrian Azza    schedule 14.06.2020


Ответы (1)


Я сделал несколько предположений, но, возможно, это код, который вам нужен:

struct Person
    parent::Union{Nothing,Person}
    age::Int
end
Person(parent::Person) = Person(parent,0)

N = 100
population = Person.(nothing, rand(20:50,N))
for i in 1:(N-1)
    for j in (i+1):N
        parent = population[population[i].age >= population[j].age ? i : j]
        push!(population, Person(parent))
    end
end

Примечания:

  1. Для этого типа кода также посмотрите пакет Parameters.jl - он очень удобен для конструкторов агентов.
  2. Обратите внимание, как конструктор был векторизован
  3. Имена типов в Julia начинаются с заглавных букв (отсюда и Person)
  4. Я предполагаю, что для детей вы хотели попробовать каждую пару родителей, поэтому вот как построить цикл. Вам не нужно оценивать ту же пару родителей, что и (i,j), а затем как (j,i).
  5. eachindex следует использовать на Arrays - не имеет смысла на скалярах
person Przemyslaw Szufel    schedule 14.06.2020
comment
Это не помогло, так как я обнаружил, что тупо создавал переменную с именем «i» внутри цикла for, которая создает индекс i, так что это плохо. Однако ваше решение улучшило мой код и полезные примечания - спасибо от новичка - person Adrian Azza; 15.06.2020
comment
ХОРОШО. Просто относитесь к этому моему примеру как к шаблону для вашего кода. - person Przemyslaw Szufel; 15.06.2020