Содержание:
Предположим, что у меня есть массив, a = [2 5 4 7] . Какова функция, возвращающая максимальное значение и его индекс?
Например, в моем случае эта функция должна возвращать 7 как максимальное значение, а 4 — как индекс.
Функция max . Чтобы получить первое максимальное значение, вы должны сделать
val — максимальное значение, а idx — его индекс.
В случае 2D-массива (матрицы) вы можете использовать:
Часть idx будет содержать номер столбца, содержащий максимальный элемент каждой строки.
Вы можете использовать max() для получения максимального значения. Функция max также может возвращать индекс максимального значения в векторе. Чтобы получить это, назначьте результат вызова max в вектор двух элементов вместо одной переменной.
например. z — ваш массив,
Здесь 7 — наибольшее число в 4-й позиции (индекс).
Для матрицы вы можете использовать это:
I — индекс A (:), содержащий наибольший элемент.
Теперь используйте функцию ind2sub для извлечения индексов строк и столбцов A, соответствующих самому большому элементу.
В.Г.Потемкин "Введение в Matlab" (v 5.3)
Глава 3. Программирование в среде Matlab 5
3.5. Индексы и подындексы
Индексы. Элемент массива А, расположенный на пересечении строки i и столбца j, обозначается как А(i, j).
Пример
Рассмотрим в качестве массива А матрицу magic(4):
А = magic(4)
А =
16 | 2 | 3 | 13 |
5 | 11 | 10 | 8 |
9 | 7 | 6 | 12 |
4 | 14 | 15 | 1 |
Тогда А(4, 3) — это элемент, расположенный на пересечении строки 4 и столбца 3, равный 15.
Можно также вычислить сумму элементов четвертого столбца
A(1, 4) + A(2, 4) + A(3, 4) + A(4, 4)
ans = 34
На элементы массива А можно ссылаться, используя единственный индекс, А(k). Это обычный способ ссылки на элементы векторов. Но точно так же можно ссылаться на элементы двумерного массива, и в этом случае этот массив рассматривается как один длинный вектор-столбец, сформированный из столбцов исходного массива. В рассматриваемом примере А(12) — это другой способ ссылки на значение 15, соответствующее элементу А(4, 3).
Если будет сделана попытка обратиться к элементу вне матрицы, то программа выдаст ошибку:
t = A(4, 5)
. Index exceeds matrix dimensions. Индекс превышает размерность матрицы.
Если же выполняется присвоение значения элементу с индексами, выходящими за пределы массива, то система MATLAB автоматически увеличивает размер матрицы.
Пример:
X = A;
X (4, 5) = 17
X =
16 | 2 | 3 | 13 | |
5 | 11 | 10 | 8 | |
9 | 7 | 6 | 12 | |
4 | 14 | 15 | 1 | 17 |
Выделение подблоков массива. Если в индексных выражениях использовать двоеточие, то можно ссылаться на подблоки массива. Так индексное выражение A(1:k, j) ссылается на блок из k элементов столбца j.
Пример:
A(1:4,3)
ans =
3 |
10 |
6 |
15 |
Здесь выделен столбец 3 матрицы magic(4).
sum(A(1:4, 3))
ans = 34
вычисляет сумму элементов столбца 3.
Однако существует способ лучше. Поскольку двоеточие само по себе ссылается на все элементы строки или столбца, то последнюю сумму можно вычислить так
sum(A(:,3))
ans = 34
Кроме того, начиная с версии 5.0, на последнюю строку или столбец массива можно ссылаться с помощью ключевого слова end. Таким образом, оператор
sum(A(:, end))
ans = 34
вычисляет сумму элементов в последнего столбца матрицы A.
Объдинение подблоков в массив. Операция объединения отдельных подблоков в массив называется конкатенацией. Даже при формировании исходной матрицу, когда объдиняются отдельные элементы, осуществляется операция конкатенации.Оператор конкатенации — это пара квадратных скобок [ ], внутри которых указываются отдельные элементы или блоки массива.
Пример.
Используя матрицу A, равную magic(4), образуем новую матрицу B размера 8×8
B = [A A+32; A+48 A+16]
B =
16 | 2 | 3 | 13 | 48 | 34 | 35 | 45 |
5 | 11 | 10 | 8 | 37 | 43 | 42 | 40 |
9 | 7 | 6 | 12 | 41 | 39 | 38 | 44 |
4 | 14 | 15 | 1 | 36 | 46 | 47 | 33 |
64 | 50 | 51 | 61 | 32 | 18 | 19 | 29 |
53 | 59 | 58 | 56 | 21 | 27 | 26 | 24 |
57 | 55 | 54 | 60 | 25 | 23 | 22 | 28 |
52 | 62 | 63 | 49 | 20 | 30 | 31 | 17 |
Эта матрица состоит из четырех блоков размера 4×4
16 | 3 | 2 | 13 |
5 | 10 | 11 | 8 |
9 | 6 | 7 | 12 |
4 | 15 | 14 | 1 |
Эта матрица есть половина другого волшебного квадрата, элементы которого находятся в диапазоне целых чисел 1:64. Суммы по столбцам уже имеют правильное значение для волшебного квадрата размера 8х8:
sum(B)
ans = 260 260 260 260 260 260 260 260
Однако сумма строк
sum (B’)
ans = 196 196 196 196 324 324 324 324
Попробуйте найти те перестановки элементов, которые приводят матрицу B к истинному волшебному квадрату порядка 8.
Удаление строк и столбцов. Используя понятие пустого массива, можно легко удалять строки, столбцы и целые подблоки.
X = A
X =
16 | 2 | 3 | 13 |
5 | 11 | 10 | 8 |
9 | 7 | 6 | 12 |
4 | 14 | 15 | 1 |
Чтобы удалить второй столбец массива X достаточно применить оператор
X (:, 2) = [ ]
X =
16 | 3 | 13 |
5 | 10 | 8 |
9 | 6 | 12 |
4 | 15 | 1 |
При попытке улалить отдельный элемент массива возникает ошибка, поскольку результат не является массивом:
X (1, 2) = []
. Indexed empty matrix assignment is not allowed.
Запрещено присвоение пустой матрицы индексному выражению.
Однако использование единственного индекса позволяет удалить одиночный элемент или последовательность элементов, при этом остающиеся элементы преобразуются в вектор-строку.
X = A;
X(:, 2) = [ ]
X =
16 | 3 | 13 |
5 | 10 | 8 |
9 | 6 | 12 |
4 | 15 | 1 |
X(2:1:12) = [ ]
X = 16
или
X = A;
X(:, 2) = [ ]
X =
16 | 3 | 13 |
5 | 10 | 8 |
9 | 6 | 12 |
4 | 15 | 1 |
X(2 : 2 : 10) = [ ]
X = 16 9 3 6 13 12 1
Индексация многомерных массивов. В системе MATLAB принято хранить каждый массив, независимо от его размерности, как вектор-столбец. Этот вектор образован объединением (конкатенацией) столбцов исходного массива.
Пример.
Система MATLAB хранит массив A
A = [2 6 9; 4 2 8; 3 0 1]
в виде следующего вектора-столбца
2 |
4 |
3 |
6 |
2 |
9 |
8 |
1 |
При обращении к массиву А с указанием единственного индекса происходит непосредственное обращение к этому вектору-столбцу. Обращение A(3) ссылается на третье значение в столбце; А(7) — на седьмое и так далее.
Если количество индексов массива больше 1, то MATLAB вычисляет индекс в столбце хранения, используя значения размерностей массива. Если двумерный массив А имеет размер [d1 d2], где d1 — число строк, а d2 — число столбцов, то для элемента с номером (i, j) его позиция в векторе хранения определяется как (j-1)*d1+i.
Пример
Для элемента A(3, 2) MATLAB вычисляет следующую позицию в векторе хранения (2-1)*3+3 = 6. Элементу с номером 6 соответствует значение 0.
Этот способ хранения и индексная схема распространяются и на многомерные массивы. В этом случае MATLAB использует схему постраничного объединения, чтобы создать столбец хранения.
Использование единственного индекса приводит к непосредственному обращению к вектору хранения.
Если задано два индекса (i, j), то MATLAB вычисляет позицию описанным выше способом, причем только для первой страницы многомерного массива и при условии, что эти индексы находятся внутри диапазона размерностей исходного массива.
Если задано более двух индексов, схему индексации усложняется. Если задано четыре индекса (i, j, k, l) для четырехмерного массиву размера d1xd2xd3xd4, то позиция элемента в векторе хранения вычисляется следующим образом
s = (l-1)(d3)(d2)(d1)+(k-1)(d2)(d1)+(j-1)(d1)+i.
Общая формула для позиции элемента в векторе хранения, соответствующего элементу (j1 j2 . jn-1 jn) n-мерного массива размера d1xd2xd3x . xdn, имеет вид
s = (jn-1)(dn-1)(dn-2). (d1)+(jn-1-1)(dn-2). (d1)+. +(j2-1)(d1)+j1.
Пример
Рассмотрим многомерный массив C размера 5х4х3х2. На рис. 3.2 показаны форматы вывода на экран и хранения.
Все переменные всех типов данных в MATLAB являются многомерными массивами. Вектор – это одномерный массив, а матрица – это двумерный массив.
Мы уже обсуждали векторы и матрицы. В этой главе мы обсудим многомерные массивы. Однако перед этим давайте обсудим некоторые специальные типы массивов.
Специальные массивы в MATLAB
В этом разделе мы обсудим некоторые функции, которые создают специальные массивы. Для всех этих функций один аргумент создает квадратный массив, двойные аргументы создают прямоугольный массив.
Функция нулей () создает массив всех нулей –
MATLAB выполнит приведенный выше оператор и вернет следующий результат –
Функция ones () создает массив всех единиц –
MATLAB выполнит приведенный выше оператор и вернет следующий результат –
Функция eye () создает единичную матрицу.
MATLAB выполнит приведенный выше оператор и вернет следующий результат –
Функция rand () создает массив равномерно распределенных случайных чисел по (0,1) –
MATLAB выполнит приведенный выше оператор и вернет следующий результат –
Магический Квадрат
Магический квадрат – это квадрат, который дает одинаковую сумму, когда его элементы добавляются построчно, по столбцам или по диагонали.
Функция magic () создает массив магических квадратов. Требуется исключительный аргумент, который дает размер квадрата. Аргумент должен быть скаляром, большим или равным 3.
MATLAB выполнит приведенный выше оператор и вернет следующий результат –
Многомерные массивы
В MATLAB массив, имеющий более двух измерений, называется многомерным массивом. Многомерные массивы в MATLAB являются расширением нормальной двумерной матрицы.
Обычно для создания многомерного массива мы сначала создаем двумерный массив и расширяем его.
Например, давайте создадим двумерный массив a.
MATLAB выполнит приведенный выше оператор и вернет следующий результат –
Массив a является массивом 3 на 3; мы можем добавить третье измерение к, предоставив такие значения, как –
MATLAB выполнит приведенный выше оператор и вернет следующий результат –
Мы также можем создавать многомерные массивы, используя функции ones (), zeros () или rand ().
MATLAB выполнит приведенный выше оператор и вернет следующий результат –
Мы также можем использовать функцию cat () для построения многомерных массивов. Он объединяет список массивов по указанному измерению –
Синтаксис для функции cat () –
B – новый созданный массив
A1 , A2 , … массивы, которые будут объединены
dim – это размер, по которому объединяются массивы.
B – новый созданный массив
A1 , A2 , … массивы, которые будут объединены
dim – это размер, по которому объединяются массивы.
пример
Создайте файл сценария и введите в него следующий код –
Когда вы запускаете файл, он отображает –
Функции массива
MATLAB предоставляет следующие функции для сортировки, вращения, перестановки, изменения формы или смещения содержимого массива.
функция | Цель |
---|---|
длина | Длина вектора или наибольшее измерение массива |
ndims | Количество размеров массива |
numel | Количество элементов массива |
размер | Размеры массива |
iscolumn | Определяет, является ли ввод вектором столбца |
пустой | Определяет, является ли массив пустым |
ismatrix | Определяет, является ли ввод матричным |
isrow | Определяет, является ли ввод вектором строки |
isscalar | Определяет, является ли вход скалярным |
isvector | Определяет, является ли входной вектор |
blkdiag | Создает блочную диагональную матрицу из входных аргументов. |
circshift | Смещает массив по кругу |
ctranspose | Комплексное сопряженное транспонирование |
диаг | Диагональные матрицы и диагонали матрицы |
flipdim | Переворачивает массив по указанному измерению |
fliplr | Отразить матрицу слева направо |
flipud | Переворачивает матрицу вверх-вниз |
ipermute | Инвертирует перестановочные размеры массива ND |
переставлять | Переставляет размеры массива ND |
repmat | Реплики и массив плиток |
перекроить | Перекраивает массив |
rot90 | Поворот матрицы на 90 градусов |
shiftdim | Смещает размеры |
issorted | Определяет, находятся ли заданные элементы в отсортированном порядке |
Сортировать | Сортирует элементы массива в порядке возрастания или убывания |
sortrows | Сортирует строки в порядке возрастания |
выжимать | Удаляет одиночные размеры |
транспонировать | транспонировать |
векторизовать | Векторизованное выражение |
Примеры
Следующие примеры иллюстрируют некоторые из функций, упомянутых выше.
Длина, Размер и Количество элементов –
Создайте файл сценария и введите в него следующий код –
Когда вы запускаете файл, он показывает следующий результат –
Круговое смещение элементов массива –
Создайте файл сценария и введите в него следующий код –
Когда вы запускаете файл, он показывает следующий результат –
Сортировка массивов
Создайте файл сценария и введите в него следующий код –
Когда вы запускаете файл, он показывает следующий результат –
Cell Array
Массивы ячеек – это массивы индексированных ячеек, где каждая ячейка может хранить массив разных измерений и типов данных.
Функция cell используется для создания массива cell. Синтаксис для функции ячейки –
С – массив ячеек;
dim – скалярное целое число или вектор целых чисел, который определяет размеры массива ячеек C;
dim1, …, dimN – скалярные целые числа, которые определяют размеры C;
obj является одним из следующих –
- Массив или объект Java
- .NET массив типа System.String или System.Object
С – массив ячеек;
dim – скалярное целое число или вектор целых чисел, который определяет размеры массива ячеек C;
dim1, …, dimN – скалярные целые числа, которые определяют размеры C;
obj является одним из следующих –
пример
Создайте файл сценария и введите в него следующий код –
Когда вы запускаете файл, он показывает следующий результат –
Доступ к данным в массивах ячеек
Существует два способа обращения к элементам массива ячеек:
- Заключение индексов в первую скобку () для ссылки на наборы ячеек
- Заключение индексов в фигурные скобки <> для ссылки на данные в отдельных ячейках
Когда вы заключаете индексы в первую скобку, это относится к набору ячеек.
Индексы массива ячеек в гладких скобках относятся к наборам ячеек.
MATLAB выполнит приведенный выше оператор и вернет следующий результат –
Вы также можете получить доступ к содержимому ячеек путем индексации с помощью фигурных скобок.
MATLAB выполнит приведенный выше оператор и вернет следующий результат –