Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

АрхитектураNo4

.pdf
Скачиваний:
13
Добавлен:
10.04.2015
Размер:
1.54 Mб
Скачать

Двумерные массивы, матрицы

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

Ввод матриц, простейшие операции

Различные способы ввода

Вводить небольшие по размеру матрицы удобно прямо из командной строки. Введите матрицу размерностью два на три

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

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

Начните набирать в командной строке

Нажмите клавишу <Enter>. Обратите внимание, что MATLAB ничего не вычислила. Курсор мигает на следующей строке без символа . Продолжите ввод матрицы построчно, нажимая в конце каждой строки <Enter>. Последнюю строку завершите закрывающей квадратной скобкой, получается:

Еще один способ ввода матриц состоит в том, что матрицу можно трактовать как вектор-строку, каждый элемент которой является вектор-столбцом. Например, матрицу два на три

можно ввести при помощи команды:

Посмотрите переменные рабочей среды в окне Workspace или наберите в командной строке whos. Итак, в рабочей среде содержится три матрицы, две прямоугольные и одна квадратная.

Обращение к элементам матриц

Доступ к элементам матриц осуществляется при помощи двух индексов — номеров строки и столбца, заключенных в круглые скобки, например

Элементы матриц могут входить в состав выражений:

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

Расположение элементов матрицы в памяти компьютера определяет еще один способ обращения к ним. MATLAB хранит элементы матрицы в памяти по столбцам. Элементы qtj матрицы Q размера m на п содержатся в памяти в последовательности:

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

Поэтому обращение к элементам матрицы как к элементам вектора при помощи одного индекса (индексация при помощи порядкового номера) приводит к предсказуемому результату

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

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

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

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

Логическое индексирование (logical subscripting) позволяет выбрать из массива элементы, удовлетворяющие определенным условиям, которые заданы логическим выражением. Подробно логические выражения будут обсуждаться в главе 7, а здесь приведем простой пример. Пусть из введенной выше матрицы В требуется выбрать все отрицательные элементы и записать их в вектор /. Сначала выполним, казалось бы, недопустимое действие: запишем в переменную ind результат сравнения матрицы и числа ноль.

Образовался логический массив (logical array) ind того же размера, что и в (см. окно Workspace), состоящий из нулей и единиц, причем единицы соответствуют отрицательным элементам массива в. Указание логического массива ind в качестве единственного индекса исходного массива в позволяет решить поставленную задачу:

Разумеется, можно было обойтись и без вспомогательного массива ind, написав сразу f = в (в < 0).

Если требуется присвоить новое значение элементам массива, удовлетворяющим определенному условию, то выражение в(в < 0) должно войти в левую часть оператора присваивания.

Только что мы рассмотрели новый тип данных MATLAB — логические массивы. В нашем примере логический массив ind был автоматически создан при выполнении операции сравнения в > о. Было бы ошибкой считать, что для выделения нужных элементов достаточно просто создать массив из нулей и единиц и указать его в качестве индекса массива. Введите, например, из командной строки массив indi с теми же элементами, что и ind:

и попытайтесь использовать его для логического индексирования, получается ошибка:

Выход состоит в преобразовании числового массива indl в логический массив ind2 при помощи функции logical, который затем применяется для индексирования:

Убедитесь, что ind2 — логический массив, изучив информацию о нем в окне Workspace. Логическое индексирование векторов производится аналогично.

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

Теперь мы знаем значение т максимального элемента, оно равно 5, и могли бы использовать логическое индексирование для записи всех максимальных значений в вектор. Двойной знак == обозначает логическое равенство:

но номера максимальных элементов все равно неизвестны. Вместо логического индексирования используем функцию find, указав во входном ее аргументе логическое выражение х == 5

Функция find вернула номера элементов вектора, совпадающих с максимальным значением.

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

Действительно, все эти элементы b3], bl3 и Ъ1Ъ меньше или равны нулю.

Вэтом примере к функции find можно обратиться и с одним выходным аргументом:

Вэтом случае вектор к содержит номера требуемых элементов матрицы с учетом описанной выше схемы хранения в памяти по столбцам. Обратимся теперь к основным операциям с матрицами в MATLAB.

Сложение, вычитание, умножение,

транспонирование и возведение в степень

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

Следите за совпадением размерности, иначе получите сообщение об ошибке:

Для умножения матриц предназначена "звездочка":

Умножение матрицы на число тоже осуществляется при помощи "звездочки", причем умножать на число можно как справа, так и слева:

Транспонирование матрицы, так же как и вектора, производится при помощи . ', а символ ' означает комплексное сопряжение. Для вещественных матриц эти операции приводят к одинаковым результатам:

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

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

Возведение квадратной матрицы в целую степень производится с использованием оператора А:

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

Учтите приоритет операций, сначала выполняется транспонирование, потом возведение в степень, затем умножение, а сложение и вычитание производятся в последнюю очередь.

Перемножение матрицы и вектора

Поскольку вектор-столбец или вектор-строка в MATLAB являются матрицами, у которых один из размеров равен единице, то все вышеописанные операции применимы и для умножения матрицы на вектор, или векторстроки на матрицу. Например, вычисление выражения

можно осуществить следующим образом:

В математике не определена операция деления для матриц и векторов, однако в MATLAB символ \ используется для решения систем линейных уравнений.

Решение систем линейных уравнений

Решите небольшую систему, состоящую из трех уравнений с тремя неизвестными:

Введите матрицу системы в массив А, ДЛЯ вектора правой части используйте массив ь. Решите систему при помощи символа \

Проверьте, правильный ли получился ответ, умножив А на х. Алгоритм решения систем линейных уравнений при помощи оператора \

определяется структурой матрицы коэффициентов системы. В частности, MATLAB исследует, является ли матрица треугольной, или может быть приведена перестановками строк и столбцов к треугольному виду, симметричная матрица или нет, квадратная или прямоугольная (MATLAB умеет решать системы с прямоугольными матрицами — переопределенные. или недоопределенные). Поэтому решать системы при помощи \ разумно, когда выбор алгоритма решения поручается MATLAB. Если же имеется информация о свойствах матрицы системы, то следует использовать специальные методы Решение систем небольшой размерности можно выполнить, введя матрицу

системы и вектор правой части непосредственно из командной строки. Однако часто требуется найти решение системы, состоящей из большого числа линейных уравнений. Для ввода данных можно воспользоваться редактором массивов, который предоставляет удобный способ ввода и дает возможность легко проверить введенные данные на наличие ошибок. Вот один из возможных способов. Создайте в рабочей среде два пустых массива размера ноль на ноль при помощи квадратных скобок:

Откройте в редакторе массив А И определите нужный размер в строках ввода Size:. Затем введите элементы матрицы в ячейки таблицы. Обратите внимание, что при нажатии <Enter> происходит переход к ячейке, расположенной под текущей. Это хорошо, если матрица вводится по столбцам. Если предпочтительнее заносить значения элементов по строкам, то следует выбрать пункт Preferences... в меню File редактора массивов и в появившемся окне Array Editor Preferences задать желаемое направление перехода в рас-

крывающемся списке Direction. Флаг Move selection after Enter должен быть включен. Аналогичным способом вводится вектор правой части системы. Матрица и вектор правой части системы могут .храниться в файлах. В следующем разделе на примере решения системы показано, как считать данные

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]