К сожалению, нет однозначного ответа на этот вопрос, поскольку наиболее эффективный подход зависит от логики всей модели (в частности, действия других агентов зависят от того факта, что некоторая запись фактически удалена из массива).
В большинстве случаев следующий подход должен быть самым простым (я оставляю findin
, что неэффективно, но я понимаю, что у вас могут быть дубликаты в myarray
в целом):
n = 1000
myarray = [i for i = 1:n];
keep = trues(n)
for (i, a) in enumerate(myarray)
keep[i] || continue # do not process an agent that is marked for deletion
if a%2 == 0 # here application logic might also need to check keep in some cases
keep[findin(myarray, [a])] = false
end
end
myarray = myarray[keep]
Если дляпо какой-то причине вам действительно нужно удалять элементы myarray
в каждой итерации, вот как вы можете это сделать:
n = 1000
myarray = [i for i = 1:n];
i = 1
while i <= length(myarray)
a = myarray[i]
if a%2 == 0
todelete = findin(myarray, [a])
i -= count(x -> x < i, todelete) # if myarray has duplicates of a you have to move the counter back
deleteat!(myarray, todelete)
else
i += 1
end
end
В общем случае код, который вы даете, будет не очень быстрым (например, если вы знаете myarray
не содержит дубликатов, это может быть намного проще - и я думаю, что вы можете).
РЕДАКТИРОВАТЬ: Вот как вы можете реализовать обе версии, если вы знаете, что у вас нет дубликатов (вы можете просто использовать индекс агента -обратите внимание, что мы также можем избежать ненужных проверок):
n = 1000
myarray = [i for i = 1:n];
keep = trues(n)
for (i, a) in enumerate(myarray)
if a%2 == 0 # here application logic might also need to check keep in some cases
keep[i] = false
end
end
myarray = myarray[keep]
Если по какой-то причине вам действительно необходимо удалить элементы myarray
в каждомитерация вот как вы можете это сделать:
n = 1000
myarray = [i for i = 1:n];
i = 1
while i <= length(myarray)
a = myarray[i]
if a%2 == 0
deleteat!(myarray, i)
else
i += 1
end
end