Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




 

Логическое индексирование позволяет выбрать из массива элементы, удовлетворяющие определенным условиям, которые заданы логическим выражением. Пусть требуется сформировать вектор 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 – среди элементов вектора есть нули.

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

 




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


Дата добавления: 2014-11-08; Просмотров: 790; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.