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

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

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

из текстового файла, получить результат и записать его в файл.

Считывание и запись данных

Перед нами стоит задача — решить систему линейных уравнений, матрица и вектор правой части которой хранятся в текстовых файлах matr.txt, rside.txt, и записать результат в файл sol.txt. Матрица записана в файле построчно, элементы в строке отделены пробелом, вектор правой части записан в столбик, как показано на рис. 2.8.

Файлы с матрицей и вектором правой части системы

Подготовьте файлы с данными, например, в стандартной программе

Windows Блокнот (Notepad). Скопируйте файлы matr.txt, rside.txt в подка-

талог work основного каталога MATLAB. Для считывания из файла используйте команду load, для записи— save. Примение load и save для сохранения и считывания переменных рабочей среды описано в главе 7, однако при работе с файлами данных используется функциональный способ вызова этих команд с выходными аргументами:

Параметр -ascii означает запись в текстовом формате. После выполнения данных команд в каталоге work создастся файл sol.txt, в котором в столбик будет записано решение системы. Посмотреть содержимое файла можно, используя любой текстовый редактор. Для записи результата в файл с двойной точностью следует использовать команду save ' s o l . t x t 1 x -ascii - double. На рис. приведено содержимое файла sol.txt в случае использования команды save с параметром -double и без него.

Содержимое файла sol.txt

Аналогично можно записать матрицу в текстовый файл. Запись, например, матрицы А, хранящейся в массиве А, В файл matrA.txt осуществляется командой save 'matrA.txt1 A -ascii. Запись в файл и считывание из файла осуществляются по строкам.

Блочные матрицы

Очень часто в приложениях возникают так называемые блочные матрицы, т. е. матрицы, составленные из непересекающихся подматриц (блоков). Соответствующие размеры блоков должны совпадать.

Конструирование блочных матриц

Введите матрицы

и создайте из них блочную матрицу

учитывая, что матрица К состоит из двух строк, в первой строке матрицы А и В, а во второй — С и D:

Блочная матрица получена. Можно было поступить и по-другому, а именно, считать, что матрица К состоит из двух столбцов, в первом — матрицы А и С , а во втором — В и D. Как бы тогда следовало записать команду для создания блочной матрицы? Проверьте себя

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

где

Решение этой задачи следующее:

Последний оператор можно заменить на эквивалентный м = [ [S; b] [а;

2.5]].

MATLAB позволяет конструировать блочно-диагональные матрицы с помощью функции blkdiag. Рассмотрим пример:

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

Выделение блоков

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

затем выделите очерченный блок, задав номера строк и столбцов при помощи двоеточия:

Для выделения из матрицы столбца или строки (т. е. массива, у которого

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

При выделении блока до конца матрицы можно не указывать ее размеры, а использовать end:

Удаление строк и столбцов

Как уже было сказано, в MATLAB парные квадратные скобки [ ] обозначают пустой массив, который, в частности, позволяет удалять строки и столбцы матрицы. Для удаления строки следует присвоить ей пустой массив. Удалите, например, первую строку квадратной матрицы:

Обратите внимание на соответствующее изменение размеров массива, которое можно посмотреть в окне Workspace или проверить при помощи size. Аналогичным образом удаляются и столбцы. Для удаления нескольких идущих подряд столбцов (или строк) им нужно присвоить пустой массив. Удалите второй и третий столбец в м

Индексация существенно экономит время при вводе матриц, имеющих определенную структуру.

Заполнение матриц при помощи индексации

Выше было описано несколько способов ввода матриц в MATLAB, в том числе считывание из файла и использование редактора массивов. Однако если матрица обладает простой структурой, то бывает проще сгенерировать ее, чем вводить. Рассмотрим пример такой матрицы:

Генерация матрицы Т осуществляется в три этапа:

1.Создание массива т размера пять на пять, состоящего из нулей.

2.Заполнение первой строки единицами.

3.Заполнение части последней строки минус единицами до последнего элемента.

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

Создание некоторых специальных матриц в MATLAB осуществляется при помощи встроенных функций

Создание матриц специального вида

Заполнение прямоугольной матрицы нулями производится встроенной

функцией zeros, аргументами которой являются число строк и столбцов матрицы:

Один аргумент функции zeros приводит к образованию квадратной матрицы заданного размера:

Единичная матрица инициализируется при помощи функции eye:

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

Матрица, состоящая из единиц, образуется в результате вызова функции ones:

Использование одного аргумента в ones приводит к созданию квадратной матрицы, состоящей из единиц.

MATLAB предоставляет возможность заполнения матриц случайными элементами. Результатом функции rand является матрица чисел, распределенных случайным образом между нулем и единицей, а функции randn— матрица чисел, распределенных по нормальному закону:

Обращение к функциям rand и randn с одним входным аргументом приводит к формированию квадратных матриц.

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

Часто возникает необходимость создания диагональных матриц, т. е. матриц, у которых все внедиагональные элементы равны нулю. Функция diag формирует диагональную матрицу из вектор-столбца или вектор-строки, располагая их элементы по диагонали матрицы:

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

Функция diag служит и для выделения диагонали матрицы в вектор, например

Все функции MATLAB для создания матриц специального вида описаны в справочной системе, см. пункт Arrays and Matrices подраздела Mathematics

раздела Functions — Categorical List.

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

Матрицу М можно представить в виде блочной матрицы из четырех квадратных блоков размера пять, диагональные блоки формируются при помощи eye, а внедиагональные — с использованием ones:

Квадратная матрица tk размера семь является трехдиагональной. Заполняя эту матрицу, можно использовать то обстоятельство, что G является сум-