Массивы, вектора и матрицы в Engee
Страница в процессе разработки. |
Введение
Для работы с данными, параметрами и сложными структурами в Engee используются массивы, вектора и матрицы. Эти структуры, реализованные на языке Julia, позволяют эффективно хранить и обрабатывать числовую информацию, включая результаты вычислений, сигналы и параметры моделей. В этой статье рассматриваются особенности каждого из них.
В Julia нумерация элементов массивов, векторов и матриц начинается с 1 , а не с 0 , как в некоторых других языках. Последний элемент имеет индекс end . Это соответствует математическим традициям, где индексация также начинается с единицы. Например, первый элемент массива a = [1, 2, 3] доступен через a[1] , а последний — через a[end] . Более подробно смотрите в разделе ниже.
|
Массив — это обобщенный многомерный контейнер, который может содержать элементы любого типа. Массивы в Julia поддерживают произвольное количество измерений, что делает их универсальным инструментом для хранения и работы с данными:
A = rand(2, 2, 3)
Вывод
2×2×3 Array{Float64, 3}:
[:, :, 1] =
0.159525 0.787948
0.358068 0.124023
[:, :, 2] =
0.228296 0.292929
0.712896 0.0253828
[:, :, 3] =
0.3547 0.837655
0.474441 0.201402
Массивы бывают динамическими и статическими:
-
Динамические массивы — это массивы, размер которых может изменяться во время выполнения программы. Они хранятся в памяти с учетом возможного расширения, что делает их более гибкими, но менее оптимальными для задач с интенсивными вычислениями. Пример:
dynamic_array = [1, 2, 3] dynamic_array[2] = 5 # Присваивание значения push!(dynamic_array, 4) # Добавление элемента deleteat!(dynamic_array, 3) # Удаление элемента с индексом 3
Вывод
4-element Vector{Int64}: 1 5 3 4
-
Статические массивы — это массивы фиксированного размера, который задается на этапе создания. Они хранятся в памяти как непрерывный блок данных, что позволяет выполнять операции быстрее за счет минимизации накладных расходов на управление памятью.
Статические массивы эффективны, когда их размер меньшее 100-200 элементов. Если размер больше 100-200 элементов, то обычно используют динамические массивы. В языке Julia статические массивы предоставляются пакетом StaticArrays.jl. Поэтому, чтобы их использовать, необходимо подключить этот пакет с помощью команды
using StaticArrays
. Пример:using StaticArrays static_array = @SVector [1, 2, 3]
Вывод
3-element SVector{3, Int64} with indices SOneTo(3): 1 2 3
В коде использовался макрос[1]
@SVector
, который создает статический одномерный массив (вектор) фиксированного размера. Существуют и другие полезные макросы для статических массивов:Макросы статических массивов
-
@SVector
— создает неизменяемый статический вектор фиксированного размера. Пример:@SVector [1, 2, 3]
. -
@MVector
— создает изменяемый (mutable) статический вектор фиксированного размера. Пример:@MVector [1, 2, 3]
. -
@SMatrix
— создает неизменяемую статическую матрицу фиксированного размера. Пример:@SMatrix [1 2; 3 4]
. -
@MMatrix
- создает изменяемую (mutable) статическую матрицу фиксированного размера. Пример:@MMatrix [1 2; 3 4]
. -
@SizedArray
— преобразует обычный массив в статический массив с фиксированным размером. Пример:@SizedArray rand(2, 2)
. -
@SArray
— создает общий неизменяемый статический массив, который может быть вектором, матрицей или массивом большей размерности. Пример:@SArray rand(2, 2, 2)
. -
@MArray
— создает общий изменяемый статический массив. Пример:@MArray rand(2, 2, 2)
. -
@StaticArray
— универсальный макрос, который создает неизменяемые массивы любых форм. Пример:@StaticArray rand(2, 2)
. -
@MutableStaticArray
— универсальный макрос для создания изменяемых статических массивов. Пример:@MutableStaticArray rand(2, 2)
. -
@zeros
— создает статический массив, заполненный нулями. Пример:@zeros(SVector, 3)
создает вектор из трех нулей. -
@ones
— создает статический массив, заполненный единицами. Пример:@ones(SMatrix, 2, 2)
создает матрицу 2×2 из единиц. -
@fill
— создает статический массив, заполненный заданным значением. Пример:@fill(SVector, 3, 42)
создает вектор из трех элементов со значением 42. -
@static
— оптимизирует выполнение блоков кода на этапе компиляции, применяя свойства статических массивов. Пример:@static if length(SVector(1, 2, 3)) == 3 println("Размер вектора равен 3") end
-
В отличие от C++, массивы в Julia могут хранить элементы разных типов. Если типы элементов можно свести к общему (например
Если типы элементов нельзя свести к общему (например, число и строка), то Julia приведет массив к типу
Это делает массивы в Julia гибкими, но стоит помнить, что использование |
Вектор — это одномерный массив, представляющий собой последовательность элементов, доступ к которым осуществляется с помощью индексов. В Julia вектор можно создать в виде вектора-столбца или вектора-строки, но их синтаксис и тип данных будут различаться:
-
Вектор-столбец создается с использованием запятых или записи в столбик:
v = [1, 2, 3] # Вектор-столбец
или
v = [1 2 3] # Вектор-столбец
Вывод
3-element Vector{Int64}: 1 2 3
-
В Julia нет отдельного типа для вектора-строки. Вместо этого строка чисел представляется как матрица размерности 1 × N:
r = [1 2 3] # Матрица 1 × 3
Вывод
1×3 Matrix{Int64}: 1 2 3
В Julia разделители в массивах определяют их структуру:
|
Матрица — это двумерный массив, представляющий таблицу чисел или других объектов, организованных в строки и столбцы. В Julia матрицы создаются как массивы с двумя измерениями:
M = [1 2 3; 4 5 6]
Вывод
2×3 Matrix{Int64}:
1 2 3
4 5 6
Разделение на векторы и матрицы в Julia позволяет эффективно организовать данные в памяти, что важно для быстрого выполнения численных расчетов. Векторы используют одномерное хранение, упрощая работу с последовательностями данных, тогда как матрицы организованы в двумерной форме, что облегчает выполнение линейной алгебры (умножение и транспонирование). Это разделение помогает оптимизировать использование кэш-памяти и процессорных ресурсов, делая вычисления более производительными.
Отличия между массивами, векторами и матрицами
Размерность:
-
Массив — контейнер с произвольным количеством измерений. Массивы имеют произвольное количество измерений, и
size(A)
может возвращать, например, (2
,2
,3
). -
Вектор — одномерный массив. У векторов всегда одна размерность, а функция
size(v)
возвращает кортеж(n,)
, гдеn
— длина вектора. -
Матрица — двумерный массив. У матриц размерность равна двум, и
size(M)
возвращает кортеж(n, m)
, гдеn
— число строк, аm
— число столбцов.
Кортеж — это неизменяемая структура данных, которая может содержать несколько элементов различных типов. В Julia кортежи используются для представления значений, которые логически связаны, но не требуют изменений. Например, результат функции В отличие от вектора и матрицы, кортеж не является массивом и не предназначен для выполнения арифметических операций. Он имеет фиксированное количество элементов и неизменяемую структуру, что делает его полезным для возвращения нескольких значений из функций или передачи параметров. |
-
Особенности реализации:
-
Методы и функции для работы с массивами применимы и к векторам, и к матрицам. Однако для каждого типа данных существуют свои оптимизированные алгоритмы.
-
В Julia вектора и матрицы являются частными случаями массивов, где вектор имеет размерность
1
, а матрица —2
.
-
-
Инициализация и синтаксис:
-
Массив с произвольной размерностью создается функцией Array или с помощью генераторов (выражения в виде
[… for …]
). Например, для Array:A = Array{Float64}(undef, 2, 2, 3)
Здесь undef — это ключевое слово, используется для создания массива без инициализации элементов. Это означает, что память для массива будет выделена, но значения его элементов останутся неопределенными (могут быть случайными).
Пример с генераторами:
array = [i^2 for i in 1:5] # Каждый элемент массива - квадрат числа от 1 до 5
-
Вектор создается как одномерный массив, элементы перечисляются через запятую:
v = [1, 2, 3]
-
Матрица записывается в виде строк, разделенных точкой с запятой (
;
), а элементы в строках разделяются пробелами или табуляцией:M = [1 2 3; 4 5 6]
-
-
Хранение в памяти:
-
Массивы с большим количеством измерений используют более общий подход к хранению данных, что может увеличивать накладные расходы при выполнении операций.
-
Описанные выше различия формируют конкретные области применения:
-
Массив используется для моделирования более сложных данных: трехмерных моделей, массивов изображений или многомерных временных рядов.
-
Вектор чаще всего применяется для одномерных данных: временных рядов, координат, сигналов.
-
Матрица представляет двумерные структуры: изображения, таблицы, системы линейных уравнений.
Основные функции для работы с массивами, векторами и матрицами
Julia предоставляет широкий набор функций для работы с массивами, включая векторы и матрицы. Подробнее о функциях и их сигнатурах читайте здесь.
Функции, помеченные символом
Для предоставления доступа к элементам таких функций используются операторы |
Ниже представлен перечень основных функций с кратким описанием и примерами:
Создание
Имя функции |
Описание |
Пример |
|
Создает массив, элементы которого равны нулю. Тип создаваемого объекта зависит от переданных аргументов: одномерный массив (вектор), двумерный массив (матрица) или многомерный массив. |
здесь:
|
|
Создает массив, элементы которого равны единице. Тип создаваемого объекта зависит от переданных аргументов: одномерный массив (вектор), двумерный массив (матрица) или многомерный массив. |
здесь:
|
|
Создает массив, заполненный случайными числами с равномерным распределением в интервале |
здесь:
|
|
Создает массив, заполненный указанным значением. Тип создаваемого объекта зависит от переданных аргументов: одномерный массив (вектор), двумерный массив (матрица) или многомерный массив. |
здесь:
|
|
Создает массив путем преобразования заданного диапазона или итерируемого объекта. Тип создаваемого объекта зависит от используемого ввода. |
здесь:
|
Изменение структуры
Имя функции |
Описание |
Пример |
|
Добавляет элемент в конец одномерного массива (вектора). Применимо только к изменяемым (динамическим) массивам. Также для добавления элемента может использоваться индекс end. |
здесь:
|
|
Удаляет и возвращает последний элемент из одномерного массива (вектора). Применимо только к изменяемым (динамическим) массивам. |
здесь:
|
|
Вставляет элемент в указанную позицию одномерного массива (вектора). Применимо только к изменяемым (динамическим) массивам. |
здесь:
|
|
Удаляет элемент по указанному индексу из одномерного массива (вектора). Применимо только к изменяемым (динамическим) массивам. |
здесь:
|
Работа с размерами
Имя функции |
Описание |
Пример |
|
Возвращает размер массива, матрицы или вектора в виде кортежа, где каждое значение соответствует размеру по конкретному измерению. |
здесь:
|
|
Изменяет размер одномерного массива (вектора). Если новый размер больше текущего, новые элементы инициализируются значением по умолчанию |
здесь:
|
|
Возвращает общее количество элементов в массиве, векторе или матрице вне зависимости от их размерности. |
здесь:
|
|
Возвращает количество измерений (размерностей) массива, вектора или матрицы. |
здесь:
|
|
Изменяет размерность массива, матрицы или вектора, преобразуя его в новый массив с указанным числом строк и столбцов. Количество элементов в новом массиве должно соответствовать количеству элементов в исходном. |
здесь:
|
Линейная алгебра
Имя функции |
Описание |
Пример |
|
Возвращает транспонированный массив или матрицу, где строки меняются местами со столбцами. Для одномерного массива (вектора) результат зависит от его ориентации. |
здесь:
|
* |
Вычисляет детерминант квадратной матрицы. Является частью пакета LinearAlgebra (требует установки пакета). Детерминант — это скалярная величина, характеризующая свойства матрицы (например, ее обратимость). |
здесь:
|
|
Вычисляет обратную матрицу для квадратной матрицы. Обратная матрица существует только для матриц с ненулевым детерминантом, то есть для тех, которые обратимы. Функция |
здесь:
|
* |
Вычисление собственных значений и векторов матрицы. Например:
|
здесь:
|
|
Вычисляет норму вектора или матрицы. Норма — это числовая характеристика, которая измеряет «размер» вектора или матрицы. По умолчанию вычисляется Евклидова норма. |
здесь:
|
Проверка
Имя функции |
Описание |
Пример |
|
Проверяет, является ли массив, вектор или матрица пустым. Возвращает |
здесь:
|
|
Проверяет, является ли объект нулевым. Возвращает Поддерживает числовые типы, а также массивы, матрицы и векторы (в Julia объект считается нулевым, если все его элементы равны нулю). |
здесь: Для чисел:
Для векторов:
Для матриц:
Для многомерных массивов:
|
|
Проверяет, является ли матрица симметричной. Возвращает |
здесь:
|
Преобразование
Имя функции |
Описание |
Пример |
|
Преобразует матрицу или многомерный массив в вектор. Она возвращает одномерный массив, в котором элементы берутся по столбцам исходной матрицы или массива. Если аргумент уже является вектором, то он возвращается без изменений. |
|
|
Перестановка измерений (осей) многомерного массива. Позволяет изменить порядок измерений без изменения самих данных, создавая новый массив с переставленными осями. |
здесь:
|
|
Горизонтальное и вертикальное объединение массивов (Конкатенация).
|
здесь:
|
|
создает независимую копию массива, вектора или матрицы. Изменения, внесенные в копию, не влияют на оригинальный объект и наоборот. |
здесь:
|
|
создает глубокую копию массива, рекурсивно копируя все вложенные структуры. Изменения в копии не влияют на оригинал. В Julia присваивание по умолчанию передает не значение, а ссылку на объект. Если нужно создать независимую копию, то есть два способа:
|
здесь:
|
|
Позволяет выполнять операции над элементами массивов с автоматическим согласованием размеров (broadcasting). Подробнее см. здесь. |
здесь:
|
Уместность применения массивов
Массивы — это удобный и гибкий инструмент для работы с данными, но в Julia есть и другие структуры, которые могут лучше подойти для определенных задач. Подробнее см. ниже.
Когда рекомендуются массивы
-
Быстрый доступ к элементам по индексу — массивы хранят элементы последовательно в памяти, что позволяет мгновенно получить доступ к любому элементу по его индексу. Например,
arr[3]
сразу вернет третий элемент массива. Это называется случайным доступом (random access), и он работает за времяO(1)
(операция выполняется за константное время, независимо от размера входных данных, то бишь доступ к элементу по индексу занимает одинаковое время, независимо от того, насколько большой массив). -
Эффективное добавление и удаление в конце — если вам нужно часто добавлять или удалять элементы в конце массива, то используйте функции
push!
(добавить элемент) иpop!
(удалить последний элемент). Эти операции выполняются очень быстро, так как не требуют перестановки других элементов. -
Работа с фиксированным количеством данных — если вы заранее знаете, сколько элементов будет храниться, то массивы работают особенно эффективно. Они выделяют память сразу, что минимизирует накладные расходы на изменение размера.
-
Векторные вычисления и линейная алгебра — Julia оптимизирована для работы с массивами, особенно с числовыми. Если работаете с матрицами, векторами или выполняете операции линейной алгебры, то массивы — это лучший выбор. Например, функции для работы с матрицами, такие как
dot
,cross
, или операции с массивами через broadcast (.+
,.*
), работают быстрее именно с массивами.
Когда не рекомендуются массивы
-
Частое добавление или удаление элементов в середине или начале — если нужно часто вставлять или удалять элементы в начале или середине массива. Например, функции
insert!
(вставка) иdeleteat!
(удаление) требуют сдвига всех последующих элементов, что делает их неэффективными для больших массивов. Альтернатива: используйтеDeque
из пакетаDataStructures.jl
, который оптимизирован для вставки и удаления с обоих концов. -
Поиск элементов по ключу — если нужно быстро находить элементы по уникальным ключам (например, по имени пользователя или ID), то массивы не подходят, ведь в них поиск выполняется перебором всех элементов (что достаточно долго). Альтернатива: используйте
Dict
(словарь), который позволяет быстро находить элементы по ключу. -
Частое изменение размера структуры — если структура данных часто меняется (например, элементы добавляются или удаляются в произвольных местах), то массивы будут неэффективны. Альтернатива: рассмотрите использование
Set
,Dict
или списковых структур, таких какList
из пакета DataStructures.jl. -
Работа с неизменяемыми данными — массивы в Julia изменяемые, то есть их элементы можно менять после создания. Если нужна неизменяемая структура данных, то лучше использовать кортежи (Tuple). Они не позволяют изменять свои элементы, что делает их удобными для хранения константных данных. Например:
t = (1, 2, 3) t[1] = 10 # Ошибка! Кортежи неизменяемы
Массивы, матрицы и векторы строк и символов
В Julia массивы, матрицы и векторы могут содержать строки или символы, так же как и числа.
# Вектор строк
v = ["apple", "banana", "cherry"]
println(v[1]) # apple
# Матрица символов
m = ['a' 'b'; 'c' 'd']
println(m[1, 2]) # b
# Трехмерный массив строк
a = [["a", "b"], ["c", "d"]]
println(a[1][2]) # "b"
-
Вектор строк — каждая строка хранится как элемент одномерного массива.
-
Матрица символов — двумерный массив, где каждый элемент — символ.
-
Трехмерный массив строк — поддерживается произвольное количество измерений с текстовыми данными.
Массивы в Julia по умолчанию динамические, но их длина фиксирована до явного изменения. Это означает, что при создании массива его текущая длина остается неизменной, пока не используются специальные методы, такие как push!
, append!
или resize!
. Это сделано для повышения производительности: операции с фиксированной длиной быстрее, так как не требуют постоянного перераспределения памяти.
Более сложные конструкции с end
, такие, как end+1
, не позволяют напрямую присваивать значение элементу массива, так как такие операции выходят за пределы текущей длины. Чтобы добавить новые элементы, нужно явно увеличить размер массива. Например, можно использовать resize!
:
a = [10, 20, 30]
resize!(a, length(a) + 1) # Расширяем массив на 1 элемент
a[end] = 40 # Присваиваем значение новому элементу
println(a) # [10, 20, 30, 40]
Конструкции с end
доступны для индексации и выполнения арифметических операций с индексами внутри существующих границ массива. Например:
-
a[end]
— доступ к последнему элементу. -
a[end-1]
— доступ ко второму с конца элементу. -
a[1:end]
— получение всего массива. -
a[1:end-1]
— получение всех элементов, кроме последнего.
В Julia нельзя напрямую присваивать значение элементу с индексом end+1 или любому индексу за пределами текущей длины массива. Чтобы изменить размер массива, необходимо использовать специальные методы, такие как resize! , push! или append! .
|
Индексация массивов
Индексация в Julia начинается с единицы, то есть первый элемент массива имеет индекс 1
. Также поддерживается специальный индекс end
, который обозначает последний элемент массива или размер соответствующего измерения. Пример индексации:
a = [10, 20, 30, 40]
println(a[1]) # 10 — первый элемент
println(a[end]) # 40 — последний элемент
# Индексация матриц
m = [1 2; 3 4]
println(m[1, end]) # 2 — последний элемент первой строки
-
Индекс
1
всегда указывает на первый элемент. -
end
используется для ссылки на последний элемент в одномерных и многомерных массивах. -
Для матриц первый индекс - номер строки, второй - номер столбца.
Другие вариации индексации:
-
Можно обратиться сразу к нескольким элементам массива с использованием диапазонов:
b = [1, 2, 3, 4, 5] println(b[2:end]) # [2, 3, 4, 5] — элементы со второго до последнего
-
Выбор элементов с определенным шагом:
b = [1, 2, 3, 4, 5] println(b[1:2:end]) # [1, 3, 5] — элементы с шагом 2
В Julia выражения вида
1:2:end
называют диапазонами (range). Диапазон — это структура, которая описывает последовательность чисел с началом, шагом и концом. Например,1:2:5
создает последовательность от 1 до 5 с шагом 2:[1, 3, 5]
.В данном примере
1:2:end
указывает, что выбор начинается с первого элемента массива (1
), идет с шагом2
и заканчивается на последнем элементе массива (end
). Диапазоны используются для удобной и эффективной работы с индексами массивов и матриц. Примеры использования диапазонов:# Простые диапазоны r1 = 1:5 # Создает последовательность [1, 2, 3, 4, 5] r2 = 1:2:10 # Создает последовательность [1, 3, 5, 7, 9] # Использование диапазона для индексации a = [10, 20, 30, 40, 50] println(a[2:4]) # [20, 30, 40] println(a[1:2:end]) # [10, 30, 50] # Диапазон с "end" println(a[3:end]) # [30, 40, 50]
-
Выбор элементов, соответствующих определенным условиям (подробнее см. ниже):
b = [1, 2, 3, 4, 5] println(b[b .> 3]) # [4, 5] — элементы больше 3
В Julia диапазоны можно задавать не только напрямую, но и с использованием переменных. Например:
arr = [10, 20, 30, 40, 50]
a = 1:2:5 # Задаем диапазон в переменной
println(arr[a]) # [10, 30, 50]
Логическая индексация
Логическая индексация в Julia позволяет выбирать элементы массива, основываясь на условиях, которые возвращают логический массив (true
/false
) той же размерности, что и исходный массив. Этот метод удобен для фильтрации данных. Пример:
# Исходный массив
a = [10, 20, 30, 40, 50]
# Условие: выбрать элементы больше 25
filtered = a[a .> 25] # [30, 40, 50]
println(filtered)
# Условие: элементы, которые кратны 10
filtered = a[a .% 10 .== 0] # [10, 20, 30, 40, 50]
println(filtered)
здесь:
-
оператор
.
перед условием (.>
,.==
) означает поэлементную операцию. Более подробное описание таких операций представлено в статье. -
логический массив
[false, false, true, true, true]
будет использоваться для выбора соответствующих элементов.
Пример с многомерным массивом:
# Матрица 2x3
m = [1 2 3; 4 5 6]
# Условие: выбрать элементы больше 3
filtered = m[m .> 3] # [4, 5, 6]
println(filtered)
Операторы для работы с массивами, векторами и матрицами
Julia предоставляет операторы, упрощающие работу с массивами — будь то одномерные (векторы), двумерные (матрицы) или более сложные многомерные структуры. Вот основные операторы, которые используются для индексации, трансформации и объединения данных:
-
Оператор
:
используется для выбора всех элементов массива вдоль определенного измерения или для создания диапазонов. Пример:# Исходный массив m = [1 2 3; 4 5 6; 7 8 9] # Все элементы первой строки println(m[1, :]) # [1, 2, 3] # Все элементы второго столбца println(m[:, 2]) # [2, 5, 8] # Диапазон индексов println(m[1:2, 1:2]) # [1 2; 4 5]
-
Оператор
'
применяется для сопряжения (транспонирования для вещественных чисел). Работает только с числовыми массивами. Пример:# Вектор-строка v = [1 2 3] # Транспонирование в столбец println(v') # [1; 2; 3;;]
Для транспонирования массивов с комплексными числами оператор '
также возвращает комплексно-сопряженный результат. Если нужен только перевод строк в столбцы (без сопряжения), то используйте функциюtranspose
.
Для транспонирования массивов с нечисловыми элементами (например, строки или пользовательские типы) используйте функцию Если применить оператор
|
-
Оператор
;
используется для объединения массивов по вертикали, то есть добавления строк. Пример:# Исходные векторы a = [1, 2, 3] b = [4, 5, 6] # Вертикальная конкатенация result = [a; b] println(result) # 6-element Vector{Int64}:[1; 2; 3; 4; 5; 6]
Итерация по массивам с помощью for
В Julia массивы можно удобно перебирать с помощью цикла for
. Рассмотрим основные способы работы с массивами через for
. Для перебора всех элементов массива используется следующий синтаксис:
arr = [10, 20, 30, 40]
for x in arr
println(x)
end
Вывод
10
20
30
40
Иногда необходимо получить не только значения, но и их индексы. Для этого используют eachindex
, который автоматически подбирает оптимальный способ индексирования:
arr = ["a", "b", "c"]
for i in eachindex(arr)
println("Элемент ", i, ": ", arr[i])
end
Вывод
Элемент 1: a
Элемент 2: b
Элемент 3: c
Альтернативный способ получить индекс и значение — функция enumerate
:
arr = ["apple", "banana", "cherry"]
for (i, val) in enumerate(arr)
println("$i: $val")
end
Вывод
1: apple
2: banana
3: cherry
Для многомерных массивов можно использовать вложенные циклы:
matrix = [1 2 3; 4 5 6]
for i in 1:size(matrix, 1) # Проход по строкам
for j in 1:size(matrix, 2) # Проход по столбцам
println("matrix[$i, $j] = ", matrix[i, j])
end
end
Вывод
matrix[1, 1] = 1
matrix[1, 2] = 2
matrix[1, 3] = 3
matrix[2, 1] = 4
matrix[2, 2] = 5
matrix[2, 3] = 6
Вместо вложенных циклов можно использовать for
напрямую:
matrix = [1 2 3; 4 5 6]
for x in matrix
println(x)
end
Вывод
1
4
2
5
3
6
Julia перебирает элементы по столбцам, а не по строкам. Чтобы обойти массив по строкам, можно использовать permutedims
или eachrow
:
for row in eachrow(matrix)
println(row)
end
Вывод
[1, 2, 3]
[4, 5, 6]
@
, которые преобразуют код перед его выполнением.