Стандартные функции для работы с матрицами



 

Уже было отмечено, что для работы с векторами и матрицами можно использовать функции, ориентированные на работу со скалярами. Эти функции применяются поэлементно к каждому компоненту матрицы или вектора. Кроме того, для матриц и векторов определены и специальные функции. Наиболее часто используемые функции приведены в табл. 2.1. Для примеров, используемых в таблице, в Workspace определены следующие переменные:

квадратная матрица а

>> a=[1 2 3; 5 -2 8; -4 0 -6]

a =

1 2 3

5 -2 8

-4 0 -6

вектор-строка b

>> b=[10 55 -30 40]

b =

10 55 -30 40

вектор-столбец с

>> c=[20; -3; 67]

c =

20

-3

67

Функции, указанные в табл. 2.1, будучи примененными к матрице, работают с отдельными ее столбцами.

Таблица 2.1

Функция Назначение Пример использования Результат
cond(a) Вычисление числа обусловленности матрицы >> cond(a); 25.4697
det(a) Вычисление определителя квадратной матрицы >> det(a); -16
fliplr(a) Перебрасывает элементы слева направо (переворачивает по горизонтали) >> fliplr(a)   3 2 1 8 -2 5 -6 0 -4
flipud(a) Перебрасывает элементы снизу вверх (переворачивает по вертикали) >> flipud(a) -4 0 -6 5 -2 8 1 2 3
inv(a) Обращение квадратной матрицы >> inv(a); -0.7500 -0.7500 -1.3750  0.1250 -0.3750 -0.4375  0.5000 0.5000 0.7500
length(a) Определение длины вектора >> length(a); >> length(a(:)); >> length(b); >> length(c); 3 9 4 3
max(a) Определение максимального элемента >> max(a); >> max(b); >> max(c); 5 2 8 55 67

Окончание табл. 2.1

 

Функция Назначение Пример использования Результат
min(a) Определение минимального элемента >> min(a); >> min(b); >> min(c); -4 -2 -6 -30 -3
mean(a) Вычисление среднего >> mean(a); >> mean(b); 0.6667 0 1.6667 18.7500
norm(a) Вычисление нормы (по умолчанию вычисляется квадратичная норма) >> norm(a); >> norm(a,1); >> norm(b); >> norm(b,1); 12.3099 17 75 135
ones(m,n) Генерация матрицы  из единиц >> ones(2,3);   >> ones(1,4); 1 1 1 1 1 1 1 1 1 1
prod(a) Вычисление произведения элементов >> prod(a); >> prod(b);   -20 0 -144 -660000
size(a) Размеры матрицы >> size(a); >> size(b); >> size(c); 3 3 1 4 3 1
sort(a) Сортировка элементов   >> sort(a);   >> sort(b);   >> sort(c); -4 -2 -6 1 0 3 5 2 8 -30 10 40 55   -3 20 67
sum(a) Сумма элементов >> sum(a); >> sum(b); >> sum(c); 2 0 5 75 84
zeros(m,n) Генерация нулевой матрицы   >> zeros(3,2);   0 0 0 0 0 0

 

Некоторые из функций работы с матрицами могут возвращать два выходных параметра. Например, max и min. Так, обращение

>> [maxval, indmax]=max(a)

maxval =

5 2 8

indmax =

2 1 2

вернет не только вектор из максимальных элементов столбцов матрицы, но и вектор их индексов в соответствующих столбцах. Для нашей матрицы максимальным в первом столбце является элемент со значением 5 и стоит он во второй строке.

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

help matfun – матричные функции линейной алгебры;

help elmat – элементарные матрицы и функции манипуляции матрицами;

help datafun – функции анализа данных;

help sparfun – функции работы с разреженными матрицами.

 

Логическое индексирование

 

Логическое индексирование позволяет выбрать из массива элементы, удовлетворяющие определенным условиям, которые заданы логическим выражением. Пусть требуется сформировать вектор b из отрицательных элементов матрицы а. Сначала решим задачу по частям. На основе операции отношения < (меньше) сформируем вспомогательную матрицу из логических значений, которые являются результатом поэлементного сравнения чисел матрицы а с нулем.

>> a=[1 -2 7; -1 4 -9]

a =

1 -2 7

-1 4 -9

>> ind=a<0

ind =

0 1 0

1 0 1

Переменная ind является логическим массивом (именно логическим, а не числовым!), состоящим из нулей и единиц. Позиции единиц в ind соответствуют размещению отрицательных элементов в матрице а. Если укажем этот логический массив в качестве индекса исходной матрицы а, то получим искомое решение

>> b=a(ind)

b =

-1

-2

-9

Отрицательные элемента матрицы а будут выбраны в вектор b по столбцам. Вспомогательный массив ind был использован для наглядности. Можно (и нужно) обойтись и без него.

>> b=a(a<0)

b =

-1

-2

-9

Другая задача: увеличить все нечетные элементы матрицы в два раза. Решение задачи одной (!) строкой

>> a(mod(a,2)~=0)=2*a(mod(a,2)~=0)

a =

2 -2 14

-2 4 -18

Логическое индексирование позволяет получить значения элементов матрицы, соответствующих некоторому условию, или изменить их. Но индексы элементов остаются неизвестными. Для поиска индексов служит функция find. По умолчанию find(x) ищет индексы ненулевых элементов x. Если выходной аргумент один, а х – матрица, то она трактуется как вектор, составленный из столбцов (так, как матрица хранится в памяти).

>> b=[0 2 -4 0 7];

>> find(b)

ans =

2 3 5

Пусть требуется определить, где в векторе стоят значения, равные его максимальному элементу. Функция max с двумя выходными аргументами (см. табл. 2.1) не решает эту задачу, поскольку находит только один максимальный элемент и его номер. Используем find следующим образом:

>> x=[2 9 9 4 -2 9 5 9 -9];

>> indmax=find(x==max(x))

indmax =

2 3 6 8

Задача решена в одну строку! Максимальные элементы, равные 9, в векторе стоят на 2, 3, 6 и 8 позициях.

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

>> a=[1 -2 7; -1 4 -9]

a =

1 -2 7

-1 4 -9

>> [i j]=find(a<0);

>> [i j]

ans =

2 1

1 2

2 3

Действительно, элементы матрицы ,  и  имеют отрицательные значения. Обратите внимание: в примере эхо результата печатается не сразу после завершения поиска, а отдельно. Это позволяет напечатать индексы более комфортно – в два параллельных столбца. В противном случае сначала был бы напечатан вектор-столбец i номеров строк, затем под ним – вектор-столбец j с номерами столбцов матрицы. Результат в таком представлении неудобен для восприятия.

При поиске ненулевых элементов функция find может иметь дополнительный (третий) выходной аргумент, в котором возвращаются значения элементов, не равных нулю.

>> d=[1 0 -2; 0 3 0]

d =

1 0 -2

0 3 0

>> [row, col, val]=find(d);

>> [row, col, val]

ans =

1 1 1          % действительно d(11)=1

2 2 3          %                     d(22)=3

1 3 -2          %                     d(13)=-2

Внимание: если третий выходной аргумент используется при поиске по другим условиям, например find(d<0), то он будет логического типа (результат сравнения d < 0, ведь именно это ищут!) и все его элементы будут равны 1 – условие истинно. Практическое применение такого результата весьма ограничено.

Совместно с функцией find и технологией логического индексирования часто применяют следующие функции, которые формируют индексную логическую матрицу из нулей и единиц, соответствующую проверяемому условию:

isfinite – 1 соответствуют числам, 0 – inf и nan;

isprime – 1 соответствуют простым числам, 0 – остальным.

Полезными бывают следующие функции, возвращающие логическую 1 (true), если:

isempty – массив пустой (если хотя бы один размер массива равен нулю);

isreal – все элементы вещественные числа (нет комплексных значений);

all – среди элементов вектора нет нулей;

any – среди элементов вектора есть нули.

С матрицами эти функции работают по столбцам.

 

вопросы для самоконтроля

1. Как вводятся с клавиатуры, отображаются на экране и хранятся в памяти компьютера матрицы, векторы-строки и столбцы?

2. Чем отличаются поэлементные и матричные операции?

3. Какова специфика применения элементарных математических функций к матрицам?

4. Поясните правила использования двоеточия при индексации.

5. Что такое автозаполнение? Где и как оно применяется?

6. Поясните правила формирования векторов и подматриц из матриц.

7. Поясните применение операции конкатенации применительно к векторам и матрицам.

8. Как выполняются логические операции применительно к матрицам?

9. Как выполняются операции отношения применительно к матрицам?

10. Какие функции работы с матрицами есть в Matlab и какова специфика их применения?

 


Дата добавления: 2021-02-10; просмотров: 124; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!