"MATLAB 7 (Наиболее полное руководство в подлиннике)" - читать интересную книгу автора (Ануфриев И.Е., Смирнов А.Б., Смирнова Е.Н.)7
но может послужить и источником ошибок в вычислениях, если один индекс случайно указан вместо двух— никакого предупреждения не выводится. Как правило, часто лучше использовать два индекса, за исключением некоторых специальных случаев, например, прохода элементов матрицы по столбцам. Еще одним способом обращения сразу ко всем элементам матрицы, удовлетворяющим некоторому условию, является логическое индексирование. Логи- Глава 2. Работа с массивами 81 ческое индексирование не является необходимым для выполнения обычных операций матричной алгебры, поэтому при первом чтении следующий раздел можно пропустить. Однако оно существенно расширяет возможности обработки векторных и матричных данных, позволяя наглядно и компактно записывать выражения с достаточно сложной логикой без программирования перебора данных. т Логическое индексирование Логическое индексирование (logical subscripting) позволяет выбрать из массива элементы, удовлетворяющие определенным условиям, которые заданы логическим выражением. Подробно логические выражения будут обсуждаться в главе 7, а здесь приведем простой пример. Пусть из введенной выше матрицы В требуется выбрать все отрицательные элементы и записать их в вектор /. Сначала выполним, казалось бы, недопустимое действие: запишем в переменную ind результат сравнения матрицы и числа ноль. » ind = В < О ind = 0 0 1 0 0 0 10 0 Образовался логический массив (logical array) ind того же размера, что и в (см. окно Workspace), состоящий из нулей и единиц, причем единицы соответствуют отрицательным элементам массива в. Указание логического массива ind в качестве единственного индекса исходного массива в позволяет решить поставленную задачу: » f = в(ind) f = -1 Разумеется, можно было обойтись и без вспомогательного массива ind, написав сразу f = в [в < 0), Если требуется присвоить новое значение элементам массива, удовлетворяющим определенному условию, то выражение в [в < 0) должно войти в левую часть оператора присваивания. Только что мы рассмотрели новый тип данных MATLAB— логические массивы. В нашем примере логический массив ind был автоматически создан при выполнении операции сравнения в > о. Было бы ошибкой считать, 82 Часть I. Основы работы в MATLAB что для выделения нужных элементов достаточно просто создать массив из нулей и единиц и указать его в качестве индекса массива. Введите, например, из командной строки массив indl с теми же элементами, что и ind: » indl = [О 0 1; 0 0 0; 10 0]; и попытайтесь использовать его для логического индексирования, получается ошибка: ??? Subscript indices must either be real positive integers or logicals. Выход состоит в преобразовании числового массива indl в логический массив ind2 при помощи функции logical, который затем применяется для индексирования; » ind2 = logical(indl) ; Убедитесь, что ind2 — логический массив, изучив информацию о нем в окне Workspace. Логическое индексирование векторов производится аналогично. Логическое индексирование позволяет получить значения нужных элементов матрицы или вектора или изменить их, но индексы элементов остаются неизвестными. Для поиска индексов элементов, удовлетворяющих определенному условию, служит функция find. Вот простой пример: требуется найти номера всех элементов вектора, равных максимальному значению. Вызов функции max с двумя выходными аргументами не решает эту задачу, поскольку находится только один элемент и его номер: » х = [12 5 3 4 5 15]; >> [т, к] = тах(х) т = 5 к « 3 Теперь мы знаем значение т максимального элемента, оно равно 5, и могли бы использовать логическое индексирование для записи всех максимальных значений в вектор. Двойной знак == обозначает логическое равенство: » хгп = х(х == 5) хга = 5 5 5 Глава 2. Работа с массивами 83 но номера максимальных элементов все равно неизвестны. Вместо логического индексирования используем функцию find, указав во входном ее аргументе логическое выражение х == 5 » lorn = find(x == 5) km - 3 6 8 Функция find вернула номера элементов вектора, совпадающих с максимальным значением. Аналогичный поиск в матрице так же осуществляется при помощи find. Пусть, например, надо найти индексы всех неположительных элементов матрицы В , введенной выше. Вызовем find с двумя выходными аргументами — векторами, в которые требуется записать значения строчных и столб-цевых индексов искомых элементов матрицы » [i, j] = find(B <= 0} i = 3 1 |
|
|