Добро пожаловать в Engee
Операции с массивами
Цель: Научиться проводить вычисления, используя массивы.
using CSV, DataFrames;
cd(@__DIR__);
data = CSV.read("datafile.csv", DataFrame, header=0)
display(data)
density = data[:,2];
v1 = data[:,3];
v2 = data[:,4];
Задача 1
В Julia есть команды для операций с числовыми массивами. Например, можно легко прибавить число к каждому элементу массива.
x = [1 2 3];
y = x .+ 2
1×3 Matrix{Int64}:
3 4 5
1 к каждому элементу матрицы v1 и поместите результат в переменную r.
Подсказка
Для прибавления скаляра поэлементно к каждому элементу вектора используйте оператор .+.
Решение
r = v1 .+ 1
Задача 2
Чтобы сложить два массива одинаковой длины, синтаксис для поэлементного сложения .+ тоже сработает, но проще сложить векторы обычным образом.
z = x + y
vs, равный сумме векторов v1 и v2.
Подсказка
Запишите результат в виде суммы векторов, с оператором + между ними.
Решение
vs = v1 + v2
Задача 3
Если нужно умножить или разделить все элементы массива на скаляр, можно воспользоваться обычным синтаксисом.
z = 2*x
y = x/3
va, содержащую значения vs, разделенные на 2.
Подсказка
Вам поможет оператор /. Нужна именно обычная, "прямая" косая черта (/), не перепутайте с обратной косой чертой (\).
Решение
va = vs / 2
Задача 4
Следующей простой операцией над векторами являются основные статистические функции. Они возвращают скаляр. Чтобы найти максимальное значение массива, используйте функцию maximum.
xMax = maximum(x)
vm, содержащую максимальное значение вектора v1.
Подсказка
Передайте переменную v1 в качестве аргумента функции maximum.
Решение
vm = maximum(v1)
Задача 5
В Julia большинство команд можно поэлементно применить к вектору или матрице, используя поэлементную нотацию.
xSqrt = sqrt.(x)
Для некоторых команд есть упрощенная нотация, например:
.√([1,2,3])
3-element Vector{Float64}: 1.0 1.4142135623730951 1.7320508075688772
round, чтобы создать переменную vr, содержащую все элементы матрицы v1, округленные до ближайшего целого числа.
Подсказка
Передайте переменную v1 в функцию round, поставив между ними точку: y = round.(x).
Решение
vr = round.(v1)
Задача 6
Оператор * осуществляет матричное перемножение. Поэтому использование * для перемножения двух векторов одинакового размера приведет к сообщению об ошибке, поскольку число столбцов в первой матрице не равно числу строк во второй.
z = [3 4] * [10 20]
LoadError:DimensionMismatch("matrix A has dimensions (1,2), matrix B has dimensions (1,2)")
Зато если использовать оператор .* для поэлементного перемножения, то эта операция пройдёт успешно.
z = [3 4] .* [10 20]
1×2 Matrix{Int64}: 30 80
mass, содержащую поэлементное произведение матриц density и v1.
Подсказка
Используйте оператор .* для поэлементного перемножения матриц одинакового размера.
Решение
mass = density .* v1
Задача 7*
В этом упражнении вы выполняли поэлементное перемножение:
- массивов одинакового размера,
- массива на скаляр.
Есть несколько других случаев, где поэлементное перемножение работает для массивов разного размера. Попробуйте выполнить эту команду:
x = [1 2; 3 4; 5 6; 7 8] .* [1; 2; 3; 4]
Какой размерности будет переменная x?