Matlab обращение к элементу матрицы

1. Матрица строка. Указывается переменная, ставится знак присвоения и в квадратных скобках через запятую или пробел перечисляются элементы:

2. Матрица столбец. В качестве разделителя элементов применяется символ «;»:

3. Квадратная или прямоугольная матрица:

>> C = [5 6 9; 56 45 73; 15,21,36];

4. Генерация вектора. Синтаксис: = : : . Если не указать шаг, то по умолчанию он принимается за 1.

5. Единичная матрица. Синтаксис: =ones( , ).

6. Нулевая матрица. Синтаксис: =zeros( , );

Доступ к ячейкам матрицы. Синтаксис: ( , ). Необходимо помнить, что нумерация строк и столбцов начинается с 1.

Операции с матрицами:

1. Скалярные операции. Умножение и деление матрицы на число, а также сложение и вычитание матрицы и числа (скаляр) – «.*», «./»,«.+», «.–». Каждая скалярная операция выполняются с каждой ячейкой матрицы отдельно. Любая скалярная (поэлементная) операция, то есть операция сразу над всем массивом, в MatLab обозначаются при помощи точки.

2. Сложение и вычитание матриц. Данная операция выполнима только с матрицами одинакового размера. При выполнении операции действие выполняется с соответствующими друг другу ячейками.

3. Произведение матриц. Производится последовательное умножение строки первой матрицы на столбец второй. Для реализации данной операции необходимо выполнение условия (количество строк первой матрицы ровно количеству столбцов во второй матрице). Матрица результата будет иметь столько же строк сколько и в первой матрице, и количество столбцов равное количеству столбцов во второй матрице.

4. Удаление отдельных столбцов или строк. Для удаления отдельных столбцов или строк матрицы используются: пустые квадратные скобки [] и оператор двоеточие (:).

>> C = [24 33 42; 34 47 60; 44 61 78]

В.Г.Потемкин "Введение в 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
48 35 34 45 37 42 43 40 41 38 39 44 36 47 46 33
64 51 50 61 53 58 59 56 57 54 55 60 52 63 62 49
32 19 18 28 21 26 23 28 25 22 23 28 20 31 30 17

Эта матрица есть половина другого волшебного квадрата, элементы которого находятся в диапазоне целых чисел 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.

Читайте также:  Бесплатная музыка в app store

Пример

Рассмотрим многомерный массив C размера 5х4х3х2. На рис. 3.2 показаны форматы вывода на экран и хранения.

пример

MATLAB позволяет несколько методов индексировать (получать доступ) элементы матриц и массивов:

  • Индексация индексов – где вы указываете позицию элементов, которые вы хотите в каждом измерении матрицы, отдельно.
  • Линейное индексирование – где матрица рассматривается как вектор, независимо от ее размеров. Это означает, что вы указываете каждую позицию в матрице с одним номером.
  • Логическая индексация – где вы используете логическую матрицу (и матрицу true и false значений) с одинаковыми размерами матрицы, которую вы пытаетесь индексировать в качестве маски, чтобы указать, какое значение нужно вернуть.

Эти три метода теперь описано более подробно с помощью следующего 3 на 3 матрицы M в качестве примера:

Индексация индексов

Самый простой способ доступа к элементу – указать его индекс столбца строки. Например, доступ к элементу во второй строке и третьем столбце:

Количество предоставленных индексов точно соответствует числу размеров M (два в этом примере).

Обратите внимание, что порядок индексов совпадает с порядком математического соглашения: индекс строки является первым. Более того, индексы MATLAB начинаются с 1 а не 0 как большинство языков программирования.

Вы можете индексировать сразу несколько элементов, передавая вектор для каждой координаты вместо одного числа. Например, чтобы получить всю вторую строку, мы можем указать, что нам нужны первый, второй и третий столбцы:

В MATLAB вектор [1,2,3] легче создать с помощью оператора двоеточия, т. Е. 1:3 . Вы можете использовать это и в индексировании. Чтобы выбрать целую строку (или столбец), MATLAB предоставляет ярлык, позволяя вам просто указать : Например, следующий код также вернет всю вторую строку

MATLAB также предоставляет ярлык для указания последнего элемента измерения в форме ключевого слова end . Ключевое слово end будет работать точно так же, как если бы это был номер последнего элемента в этом измерении. Поэтому, если вы хотите, чтобы все столбцы от столбца 2 до последнего столбца, вы можете использовать следующее:

Индексация индексирования может быть ограничительной, поскольку она не позволит извлекать отдельные значения из разных столбцов и строк; он будет извлекать комбинацию всех строк и столбцов.

Например, индексирование индексов не может извлекать только элементы M(2,1) или M(3,3) . Для этого мы должны рассмотреть линейную индексацию.

Линейная индексация

MATLAB позволяет обрабатывать n-мерные массивы как одномерные массивы при индексировании с использованием только одного измерения. Вы можете напрямую получить доступ к первому элементу:

Обратите внимание, что массивы хранятся в основном порядке в MATLAB, что означает, что вы получаете доступ к элементам, сначала спустившись по столбцам. Таким образом, M(2) является вторым элементом первого столбца, который равен 3 а M(4) будет первым элементом второго столбца, т.е.

Существуют встроенные функции в MATLAB для преобразования индексов индексов в линейные индексы и наоборот: sub2ind и ind2sub соответственно. Вы можете вручную преобразовать индексы ( r , c ) в линейный индекс на

Чтобы понять это, если мы находимся в первом столбце, линейный индекс будет просто индексом строки. Вышеприведенная формула верна для этого, поскольку для c == 1 , (c-1) == 0 . В следующих столбцах линейный индекс – это номер строки и все строки предыдущих столбцов.

Обратите внимание, что ключевое слово end прежнему применяется и теперь относится к самому последнему элементу массива, т.е. M(end) == M(end, end) == 2 .

Вы также можете индексировать несколько элементов с помощью линейной индексации. Обратите внимание: если вы это сделаете, возвращаемая матрица будет иметь ту же форму, что и матрица индексных векторов.

Читайте также:  Как загрузить фото из айклауда на компьютер

M(2:4) возвращает вектор строки, потому что 2:4 представляет вектор строки [2,3,4] :

В качестве другого примера M([1,2;3,4]) возвращает матрицу 2 на 2, потому что [1,2;3,4] является матрицей 2 на 2. Посмотрите приведенный ниже код, чтобы убедить себя:

Обратите внимание, что индексирование с помощью : alone всегда будет возвращать вектор-столбец:

Этот пример также иллюстрирует порядок, в котором MATLAB возвращает элементы при использовании линейной индексации.

Логическая индексация

Третий метод индексирования – использовать логическую матрицу, т. Е. Матрицу, содержащую только true или false значения, в качестве маски для фильтрации элементов, которые вы не хотите. Например, если мы хотим найти все элементы M , которые больше 5 мы можем использовать логическую матрицу

для индекса M и возвращать только значения, превышающие 5 следующим образом:

Если вы хотите, чтобы этот номер оставался на месте (т. Е. Сохранял форму матрицы), тогда вы могли бы назначить логический комплимент

Мы можем уменьшить сложные кодовые блоки, содержащие операторы if и for , используя логическую индексацию.

Возьмите не-векторизованный (уже сокращенный до одного цикла с помощью линейной индексации):

Это можно сократить до следующего кода, используя логическую индексацию:

Или даже короче:

Подробнее об индексировании

Более высокие размерные матрицы

Все упомянутые выше методы обобщаются на n-мерные. Если мы используем в качестве примера трехмерную матрицу M3 = rand(3,3,3) , то вы можете получить доступ ко всем строкам и столбцам второго среза третьего измерения, написав

Вы можете получить доступ к первому элементу второго среза с помощью линейной индексации. Линейное индексирование будет двигаться только ко второму срезу после всех строк и всех столбцов первого среза. Таким образом, линейный индекс для этого элемента равен

Фактически, в MATLAB каждая матрица n-мерна: просто случается так, что размер большинства других n-измерений один. Итак, если a = 2 то a(1) == 2 (как и следовало ожидать), но также a(1, 1) == 2 , как и a(1, 1, 1) == 2 , a(1, 1, 1, . 1) == 2 и т. Д. Эти «дополнительные» размеры (размером 1 ) называются одноэлементными размерами . squeeze команды удалит их, и можно использовать permute чтобы поменять порядок размеров вокруг (и при необходимости ввести размеры синглтона).

N-мерную матрицу можно также индексировать, используя m индексов (где m M(1,1) и M(2,3) но также вернет M(1,3) и M(2,1) . Это может показаться неинтуитивными , когда вы ищете элементы для списка пар координат , но рассмотрим пример большей матрицы A = rand(20) (заметим , теперь A 20 матрицу с размерностью 20 ), где вы хотите получить верхний правый квадрант. В этом случае вместо того, чтобы указывать каждую пару координат в этом квадранте (и этот случай равен 100 парам), вы просто указываете 10 строк и 10 столбцов, которые вы хотите, так что A(1:10, 11:end) . Нарезка такой матрицы гораздо более распространена, чем запрос списка пар координат.

В случае, если вы хотите получить список пар координат, самым простым решением является преобразование в линейную индексацию. Рассмотрим проблему, в которой у вас есть вектор индексов столбцов, который вы хотите вернуть, где каждая строка вектора содержит номер столбца, который вы хотите вернуть для соответствующей строки матрицы. Например

Поэтому в этом случае вы действительно хотите вернуть элементы в (1,3) , (2,2) и (3,1) . Таким образом, используя линейное индексирование:

Возвращение элемента несколько раз

С индексом и линейной индексацией вы также можете вернуть элемент несколько раз, повторяя его индекс так

Вы можете использовать это, чтобы дублировать целые строки и столбец, например, чтобы повторить первую строку и последний столбец

Для получения дополнительной информации см. Здесь .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector