Я полный нуб в Джулии и ее синтаксисе. Я пытаюсь следить за этой статьей о полуопределенном программировании на Джулии.
Я был бы признателен, если бы кто-нибудь помог мне понять, что на самом деле делает цикл for в In[4]
:
for i in 1:m
A[:, (i-1)*n+1:i*n] .= random_mat_create(n)
b[i] = tr(A[:, (i-1)*n+1:i*n]*X_test)
end
Насколько я понимаю, он должен создать вектор матриц A
(m из них), а также m-мерный вектор b
. Я полностью запутался в индексации A
и индексации b
.
Я хотел бы объяснить часть :, (i-1)*n+1:i*n
этого кода. Причина, по которой я спрашиваю здесь, заключается в том, что я также не знаю, что искать в Google или что искать в документации по Джулии.
Извините за глупый комментарий, вы имеете в виду матричный столбец?
Столбец — это всего лишь одна из осей в матрице (массив с 2 измерениями), вы можете указать доступ по нескольким осям в Джулии, разделив их запятыми. Если вы знакомы с numpy, это то же самое.
Большое спасибо. Действительно, это похоже на numpy или panda, но я не понимаю ввод после столбца, я думаю. Цель этого цикла — заполнить этот вектор матриц, но индексация по-прежнему для меня загадочна.
К расширенному индексированию нужно немного привыкнуть, вы справитесь.
(i-1)*n+1:i*n
создает диапазон от (i-1)*n + 1
до i*n
. Например, если i
=2 и n
=10, этот диапазон становится 11:20
, поэтому A[:, (i-1)*n+1:i*n]
захватит все строки A
(это то, что делает :
) и столбцы 11-20.
Я понимаю. Вот и все, второй :
тогда создает диапазон. Это немного сбивает с толку, потому что при написании чего-то вроде a=rand([0:9], 2, 2)
я получаю не матрицу 2x2 со случайными значениями от 0 до 9, а случайные размещения «0: 9» в этой матрице 2x2.
Это потому, что [0:9]
отличается от 0:9
. Вы должны использовать rand(0:9, 2, 2)
.
Там есть две непонятные вам операции:
:
оператор. Рассмотрим Matrix
a = zeros(3,3)
. Вы можете использовать оператор нарезки массива (аналогично numpy или Matlab), чтобы выбрать все вторые столбцы как: a[1:end,2]
. Однако при выборе всего от начала до end
эти два значения можно опустить, и, следовательно, вы можете написать a[:,2]
(мне всегда казалось, что это самый простой способ запомнить это).
(точка) оператор. Джулия очень внимательно относится к тому, что векторизуется, а что нет. В numpy или R операции векторизации всегда происходят автоматически. В Джулии у вас есть контроль, но с контролем приходит и ответственность. Следовательно, попытка присвоить значения второму столбцу, написав a[:, 2] = 5.0
, приведет к ошибке, потому что справа есть вектор, а слева скаляр. Если вы хотите векторизовать, вам нужно сказать об этом Джулии. Следовательно, оператор точки .=
означает «выполнить поэлементное присваивание». Обратите внимание, что любая функция или оператор Джулии, даже ваши собственные функции, могут быть украшены такой точкой .
. Поскольку это очень важная функция языка, загляните на https://docs.julialang.org/en/v1/manual/arrays/#BroadcastingБольшое спасибо за ваш ответ. Хотя я понимаю оператор среза :
в контексте массивов, меня здесь смущает то, что есть второй оператор :
.
что вы подразумеваете под словом "второй"? В вашем коде :
всегда речь идет о нарезке массива. Кстати, попробуйте ввести ?:
в консоли Julia.
Я имею в виду тот "диапазон", о котором вин93843 упоминал выше.
1:10
— это эквивалент range(1,11)
в Python — вот и все. В Джулии это также может быть записано как (:)(1,10)
или UnitRange(1,10)
. Просто написать двоеточие короче.
Доступ к массиву : сам по себе означает всю ось. Часть после запятой — это следующая ось, и она строит диапазон вдоль этой оси.