Юлия: Что такое undef в массиве в Юлии - PullRequest
3 голосов
/ 17 октября 2019
  1. Это конструктор для массивов:

Array{T}(undef, dims)

Я новичок в Юлии, и у меня нет хорошего опыта программирования. В этом синтаксисе, почему undef используется для создания массива?

Что такое конструктор в Юлии, в какой ситуации мы используем конструктор?

Если мы не введем конструктор, Джулия автоматически создаст конструктор. Тогда, почему мы используем конструктор?

1 Ответ

6 голосов
/ 17 октября 2019

Во-первых, вы хотите понять, что такое конструктор: для этого я предлагаю вам документ Джулии: Конструкторы в Юлии

Теперь, когда у вас есть теория, давайте разберем этовыражение:

a = Array{Int}(undef, (2, 2)) 

Что говорит это выражение: «Я хочу, чтобы a было Array измерения (2, 2)». Поэтому Юля попросит немного памяти. Когда я пишу это на Джулию, REPL:

julia> a = Array{Int}(undef, (2, 2))
2×2 Array{Int64,2}:
 0  0
 0  0

Теперь Array{T}(undef, dims) является обобщением этого. «Построить массив определенного типа T с определенным числом измерений dims»

До сих пор я не объяснил, что такое undef. undef является ярлыком для UndefInitializer(). В этом примере мы хотели получить неинициализированный массив. Что это значит? Для этого вы должны понимать, что переменные не создаются ex nihilo на вашем терминале. Они занимают определенное место в памяти вашего компьютера. И иногда, то же самое пространство памяти было занято другой переменной. Таким образом, пространство, которое может занять моя новая переменная, может быть не пустым:

julia> a = Array{Float64}(undef, (2, 2))
2×2 Array{Float64,2}:
 6.94339e-310  6.94339e-310
 6.94339e-310  0.0  

Здесь я никогда не просил, чтобы эти значения были там. Я мог бы стереть его для работы с чистой переменной. Но это будет означать стирание значения для каждой ячейки, и для компьютера гораздо дороже заменить каждое значение, а не объявлять «вот новая переменная».

Таким образом, в основном undef и неинициализированные массивы используются для повышения производительности. Если вы хотите, чтобы массив был хорошо инициализирован, вы можете использовать fill .

...