Я заметил, что вопрос действительно путается (потому что плохо сформулирован, извините за это). Поэтому есть два возможных ответа: один - [1,2,4]
, который представляет собой массив с ненулевыми элементами; другой - [1,2,5]
, который является массивом индексов ненулевых элементов.
Давайте начнем с первого варианта
A = [1,2,0,0,4,0]
B = []
for i=1:endof(A)
if A[i] != 0
push!(B,i)
end
end
println(B)
Выход Any[1,2,5]
Однако тип не один я хотел. Использование typeof(B)
это показывает Array{Any,1}
, поэтому я добавил этот код:
B = Array{Int64}(B)
println(B)
typeof(B)
И результат желаемой
[1,2,5]
Array{Int64,1}
Для повышения его эффективности, следуя рекомендации в комментариях, я указал тип Б с функцией eltype()
до того, как цикл следующим образом:
A1 = [1,2,0,0,4,0] #The default type is Array{Int64,1}
B1 = eltype(A1)[] #Define the type of the 0 element array B with the type of A
#B1 = eltype(typeof(A))[] this is also valid
for i=1:endof(A1)
if A1[i] != 0
push!(B1::Array{Int64,1},i::Int64)
end
end
println(B1)
typeof(B1)
Затем выходной сигнал снова желаемый
[1,2,5]
Array{Int64,1}
Простейший способ сделать это - использовать функцию find()
. Однако, поскольку я начинающий, я хотел сделать это по-другому. Однако есть еще одна альтернатива, предоставляемая @DNF, которая превосходит find()
для случаев, которые он протестировал (см. Ниже ответы).
Второй вариант, который создает матрицу вывода с ненулевыми элементами, был предоставлен другими пользователями (@Harrison Grodin и @P i) в этом обсуждении.
Спасибо всем вам за помощь!
Можете ли вы объяснить немного больше, где ваша проблема? Вы ищете 'push!'? Вы также можете посмотреть исходный код 'find' с' @less find (A) '. – tim
Я скорее желаю, чтобы сообщество было менее поспешным, чтобы опустить новых членов. @ user7546279, выберите прозвище, и мы будем любить вас больше. И проверьте https://gitter.im/JuliaLang/julia –
'B = A [A.! = 0]' также работает (спасибо @ Ismael-VC) –