Добро пожаловать в Engee
Векторы и матрицы
Цель: Научиться создавать переменные, в которых хранится несколько объектов одинакового типа (чисел, строк, символов и т.д.).
Упражнение 1: Ввод массивов вручную
Некоторые типы переменных в Julia являются коллекциями, одним из видов типов данных-коллекций являются массивы. Такие переменные содержат в себе много чисел, строк и любых других элементов. Вы можете складывать в массивы разные данные, характеризующие один общий объект.
Поскольку вы будете использовать массивы практически в каждой вашей работе или модели, довольно важно познакомиться с их работой заранее и усвоить релевантную терминологию.
Задача 1
Самый простой числовой тип данных – это скаляр, но порой массивы гораздо полезнее, поскольку позволяют проделывать самые разные действия над целым набором чисел сразу.
x и присвойте ей значение 4.
Подсказка
Воспользуйтесь оператором присваивания, чтобы создать эту переменную.
Решение
x = 4
Задача 2
Вы можете создавать массивы, хранящие несколько значений, используя квадратные скобки.
x = [3 5]
1×2 Matrix{Int64}: 3 5
Можно отметить, что тип описанного выше выражения на самом деле называется не Array (массив), а Matrix. В этом курсе мы позволим себе смешивать понятия массива, матрицы и вектора, когда нет особой необходимости делать различие.
y, содержащий два элемента: 7 и 9.
Подсказка
Разделите элементы массива пробелами или запятыми и заключите их в квадратные скобки, чтобы создать массив.
Решение
y = [7 9]
Задача 3
Когда вы разделяете элементы массива при помощи пробелов, как было в предыдущем задании, Julia объединяет их в коллекцию типа Matrix – тип коллекций, имеющий одно или несколько измерений и некоторые собственные методы работы. Если, однако, разделить числа запятыми или точкой с запятой, то Julia создаст коллекцию типа Vector.
x = [1;3]
2-element Vector{Int64}: 1 3
z, содержащий два элемента: числа 7 и 9 .
Попробуйте запустить предыдущую команду повторно, с другим разделителем между числами (точка с запятой ; или запятая ,).
Подсказка
Отделите каждый элемент точкой с запятой (;) или просто запятой (,). Заключите всю конструкцию в квадратные скобки.
Решение
z = [7;9]
Задача 4
a, содержащий числа 3, 10, и 5 именно в таком порядке.
Подсказка
Разделяйте числа запятыми или точкой с запятой и поместите в квадратные скобки.
Решение
a = [3, 10, 5]
Задача 5
Если совместить в одном объявлении разделители в виде пробелов и в виде точки с запятой, то можно создать матрицу, то есть массив с несколькими строками и столбцами. Задавая матрицу значений, принято описывать ее построчно, строка за строкой.
x = [3 4 5; 6 7 8]
2×3 Matrix{Int64}:
3 4 5
6 7 8
print(x)
[3 4 5; 6 7 8]
b, содержащую следующие значения:
5 6 7 8 9 10
Подсказка
Для создания матрицы разделяйте элементы в одной строке пробелами, а строки разделяйте между собой при помощи точки с запятой или просто при помощи запятых.
Решение
b = [5 6 7; 8 9 10]
Задача 6
Элементы в квадратных скобках могут быть числами, переменными или результатами вычислений каких-либо математических выражений.
x = [abs(-4) 4^2]
1×2 Matrix{Int64}: 4 16
d и поместите в него результат вычисления sqrt(10) в качестве первого элемента и результат вычисления pi^2 в качестве второго элемента.
Подсказка
Поместите выражения прямо внутрь квадратных скобок и разделите их пробелом.
Решение
d = [sqrt(10) pi^2]
Задача 7*
Массивы, матрицы и векторы имеют множество применений, особенно в научных вычислениях.
Синтаксис описания векторов довольно гибкий, один и тот же вектор можно задать по-разному.
x = [7; 9]
x=[7,9]
x = [7
9]
Попробуйте поэкспериментировать с разными разделителями и опишите такую матрицу:
Выведите ваше выражение на печать при помощи функции display(). После каждого изменения запускайте ячейку на исполнение , чтобы проверить вывод команд.
Когда все получилось, можете переходить к следующему упражнению.
Упражнение 2: Задаем арифметические последовательности
Задача 1
Довольно часто нужно создать вектор, содержащий упорядоченную последовательности чисел. Например, такую:
y = [5, 6, 7, 8]
4-element Vector{Int64}: 5 6 7 8
x, содержащий значения 1, 2 и 3, именно в таком порядке, разделенные запятыми.
Подсказка
Перечислите в квадратных скобках все указанные элементы.
Решение
x = [1, 2, 3]
Задача 2
Если нужно создать более длинный вектор, вводить числа одно за другим уже не практично. Более удобный способ задания упорядоченных последовательностей состоит в том, чтобы использовать оператор : для определения диапазона, заданного границами интервала. Шаг между числами по умолчанию равен 1.
Заметим, что если вы напишете y = 5:8 или y=[5:8], то вы создадите не вектор, а объект типа диапазон (range). Он будет хранить не сами элементы диапазона, а их функцию-генератор.
y = [5:8]
1-element Vector{UnitRange{Int64}}:
5:8
Если после диапазона добавить точку с запятой (;), то мы получим вектор-столбец чисел:
y = [5:8;]
4-element Vector{Int64}:
5
6
7
8
y, заполненный целыми числами от 1 до 10. На этот раз воспользуйтесь оператором диапазона (:).
Подсказка
Задайте диапазон чисел, воспользовавшись соответствующим оператором (:). Поставьте точку с запятой после диапазона и заключите всё в квадратные скобки.
Решение
y = [1:10;]
Задача 3
Оператор диапазона (:) по умолчанию создает ряд чисел с шагом 1, однако вы можете указать любой другой шаг. Например, чтобы разместить числа с шагом 2, запустите команду:
x = [20:2:26;]
4-element Vector{Int64}: 20 22 24 26
z с числами от 1 до 5, расположенными с шагом 0.5.
Подсказка
Используйте оператор : чтобы задать диапазон в форме начало:шаг:конец.
Решение
z = [1:0.5:5;]
Задача 4
a с элементами, расположенными между 3 и 13, с шагом между ними, равным 2.
Подсказка
Впишите параметры диапазона в конструкцию вида начало:шаг:конец. Значение посередине этой конструкции хранит желаемое расстояние между элементами вектора.
Решение
a = [3:2:13;]
Задача 5
Если известно количество элементов, из которого должен состоять вектор (например, 5 элементов), то наполнить диапазон можно при помощи функции LinRange:
LinRange(начало, конец, количество_элементов)
В прошлых командах мы задавали шаг между соседними элементами. Заметим, что здесь для разделения аргументов команды используются запятые (,).
x = LinRange(0,1,5)
5-element LinRange{Float64}: 0.0,0.25,0.5,0.75,1.0
Также отметим, что эту функцию мы не переводили в вектор при помощи квадратных скобок: предполжим, что формат ее вывода нас и так вполне устраивает.
b, минимальный элемент которого должен быть равен 1, максимальный будет равен 10, а всего в нем должно быть 5 элементов.
Подсказка
Задайте вектор с пятью элементами при помощи функции LinRange. В качестве третьего аргуметна функции нужно будет передать количество элементов в векторе.
Решение
b = LinRange(1,10,5)
Задача 6
Создавая диапазоны при помощи LinRange или оператора :, мы не задавались вопросом, создаем ли мы вектор-столбец или вектор-строку, потому что в языке Julia допустимы одномерные векторы. Если для вычислений нужен вектор-столбец, его можно получить при помощи операции транспонирования ('):
x = [1:3;]
3-element Vector{Int64}:
1
2
3
x = x'
1×3 adjoint(::Vector{Int64}) with eltype Int64:
1 2 3
Заметим, что вектор не стал матрицей, а стал объектом типа adjoint. Обычно это не создает проблем при вычислениях, но вы также можете попробовать придать вектору нужную форму несколькими другими способами, например, командой transpose или reshape:
x = [1:3;]
3-element Vector{Int64}:
1
2
3
x = reshape(x, 1, 3)
1×3 Matrix{Int64}:
1 2 3
b при помощи оператора '.
Подсказка
Напишите оператор транспонирования ' после b.
Решение
b = b'
Задача 7
Другая полезная команда для преобразования размерностей векторов – reshape.
x = reshape([1:5;], 1, :)
1×5 Matrix{Int64}:
1 2 3 4 5
В этой строке мы создали вектор, а потом привели его к нужной размерности: 1 строка, : столбцов.
Что означает двоеточие в качестве аргумента? Здесь оно означает то, что мы не хотели бы указывать размер выходного вектора по какому-то из измерений. Вместо этого мы просим Julia самостоятельно рассчитать размерность, исходя из количества элементов во входном векторе.
c с числами от 5 до 9, с шагом между элементами равным 2.
Подсказка
Используйте аргумент :. Передайте создаваемый вектор в качестве первого аргумента в команду reshape, остальные аргументы выставите следующими: reshape(..., 1, :).
Решение
c = reshape(5:2:9, 1, :)
Задача 8*
Проверьте свою интуицию: если бы вам нужно было создать вектор от 1 до 2π, заполненный 100 элементами, какая конструкция вам пригодилась бы? Функция LinRange или оператор :?
Упражнение 3: Функции для создания массивов
Задача 1
В Julia есть много функций для создания часто требуемых стандартных матриц, например, состоящих из случайных чисел.
x = rand(2,2)
2×2 Matrix{Float64}:
0.19708 0.546564
0.489922 0.983707
print(x)
[0.19708032071070547 0.5465642655617113; 0.4899215996759634 0.9837071394460919]
Аргумент вида (2,2) в команде rand(2, 2) означает, что команда должна вернуть матрицу размером 2 на 2 элемента, содержащую равномерно распределенные от 0 до 1 случайные числа.
x, содержащую матрицу из равномерно распределенных случайных чисел размером 5 на 5 элементов.
Подсказка
Передайте аргументы(5,5) в функцию rand.
Решение
x = rand(5,5)
Задача 2
Если передать в функцию инициализации матриц одно число (n), то вы получите на выходе одномерный вектор.
x = rand(2)
2-element Vector{Float64}:
0.6422609536987551
0.21016527422292453
Указывая два аргумента (n, m), вы создаете матрицу с n строками и m столбцами.
x = rand(2,3)
2×3 Matrix{Float64}:
0.888272 0.198558 0.126051
0.224088 0.857988 0.235799
rand создайте вектор-столбец из случайных чисел с 5 строками 1 столбцом. Поместите результат в переменную y.Подсказка
Передайте значения 5 и 1 в функцию rand.
Решение
y = rand(5,1)
Задача 3
Тот же синтаксис, что и rand, используют многие другие функции создания массивов. К примеру, функции zeros и ones создают матрицы, целиком заполненные нулями или единицами соответственно.
x = ones(2,3)
2×3 Matrix{Float64}:
1.0 1.0 1.0
1.0 1.0 1.0
zeros создайте матрицу размером в 6 строк и 3 столбца (6 на 3), названную z и состоящую из нулей.
Подсказка
Подставьте значения 6 и 3 в качестве аргументов функции zeros.
Решение
z = zeros(6,3)
Задача 4*
Как узнать размер матрицы? Вы можете использовать функцию size.
size(x)
Эта команда дает нам информацию о матрице, а еще она часто используется при создании новых матриц. С ее помощью можно задать размер новой матрицы таким, чтобы он был равен размеру другой матрицы, уже существующей. Это очень укорачивает код: rand(size(x)...). Оператор ... нужен для того, чтобы перевести упорядоченный набор чисел, который возвращает функция size, в набор аргументов функции rand. Попробуйте!