Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Антонюк и др.doc
Скачиваний:
48
Добавлен:
07.11.2018
Размер:
32.99 Mб
Скачать

Буферизованные потоки.

Класс streambuf является основой для потокового буферизованного ввода/вывода. Он используется также для порождения класса файловых буферов (filebuf) и классов istream и ostream, содержащие указатели на streambuf.

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

#include <fstream.h>

#include <fcntl.h>

void main()

{

char ch;

long linecount=0;

filebuf inbuf,outbuf;

inbuf.open(“infile.dat”,_O_RDONLY | _O_TEXT);

if(inbuf.is_open()==0)

{

cerr<<”cant open input file”;

return;

}

istream is(&inbuf);

outbuf.open(“outfile.dat”,_O_WDONLY | _O_TEXT);

if(outbuf.is_open()==0)

{

cerr<<”cant open output file”;

return;

}

ostream os(&outbuf);

while(is)

{

is.get(ch);

os.put(ch);

if(ch==’\n’)linecount++;

}

inbuf.close();

outbuf.close();

cout<<”\nYou had: “<<linecount<<” lines”;

}

Допустимо использовать следующие методы класса filebuf: attach(), close(), fd(), is_open(), open(), overflow(), seekoff(), setbuf(), sync(), underflow().

Строковые потоки.

Все буферизованные объекты используют фиксированный буфер памяти. Его можно разделить на get область и put область. Они могут накладываться друг на друга. Программа может манипулировать этими областями при помощи защищенных методов класса. Для объектов, созданных на основе streambuf имеются отдельные указатели для ввода и для вывода.

Класс strsterambuf порождается из класса streambuf. Представители этого класса могут использовать следующие методы: sgets(),sgetn(), sputs(), sputn(), snextc(), sbumpc(), stossc(), sputbackc(), out_waiting(), in_avail(),dbp(), seekof(), seekpos(), overflow(), underflow(), setbuf(), sync().

#include <strstrea.h>

void main()

{

chat c;

strstreambuf mybuf(1024);

mubuf.sputc(‘A’);

c=mybuf.sgetc();

cout<<c;

}

Двоичные файлы.

Двоичные файлы или потоки содержат последовательности байтов; никаких преобразований символов не выполняется. Для указания двоичного режима в конструктор необходимо добавить описатель ios::binary:

#include <fstream.h>

#include <string.h>

void main()

{

int i=0;

long ltellp;

char sample[40]=”Sample string\n”;

ofstream my_out_stream(“outfile.out”,ios::out | ios::binary);

while(sample[i]!=0)

{

my_out_stream.put(sample[i]);

ltellp=my_out_stream.tellp();

cout<<”\ntellp value: “<<ltellp;

i++;

}

my_out_stream.write(sample,strlen(sample));

ltellp.my_out_stream.tellp();

cout<<”\ntellp after write: “<<ltellp;

my_out_stream.close();

}

Вычисления в интерактивном режиме.

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

2.851038547e+12; -456.38456978; 0.0045692e0;

0.93185e-1; 4.5; -123 и т.д.

У целых чисел отсутствуют дробные части, но они все равно представляются системой MATLAB на машинном уровне в той же форме, что и дробные числа. Этот основной тип данных называется double.

Именно этот тип данных подразумевается "по умолчанию" для любой переменной. Под мантиссу и показатель степени (на машинном уровне используется двоичная система записи чисел) отводится 8 байт памяти. В результате достигается точность представления десятичных чисел порядка 15 значащих цифр. При этом максимальным по модулю представимым в системе MATLAB вещественным числом является

1.797693134862316e+308

а минимальным по модулю является следующее вещественное число:

2.225073858507202e-308

Д ля этих чисел даже зарезервированы имена: realmax и realmin.

После запуска среды MATLAB в её командном окне появляется знак приглашения >>, после которого можно вводить с клавиатуры числа, имена переменных, знаки операций (в частности, знак = соответствует операции присваивания), что в совокупности составляет некоторое выражение. Имена переменных начинаются с буквы и состоят из букв, цифр и знаков подчёркивания. MATLAB распознаёт в именах переменных до 31 символа (остальные игнорирует) и различает регистр символов. Нажатие клавиши Enter заставляет систему MATLAB вычислить значение выражения и показать результат, как это показано на рисунке.

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

format long

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

res =

-93.29900636942675

Теперь все результаты вычислений будут показываться с такой высокой точностью в течение данного сеанса работы MATLABа. Если требуется до прекращения текущего сеанса работы вернуться к старой точности визуального представления вещественных чисел в командном окне MATLABа, нужно ввести и исполнить (нажав клавишу ENTER) команду

format short

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

format rat

Ранее вычисленная переменная res, будет показана в следующем виде:

res =

-9050/97

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

2. Операции над вещественными числами. Над вещественными числами производятся арифметические операции сложения, вычитания, умножения и деления, для которых используются знаки + , - , * и / . Кроме того, есть ещё операция возведения в степень, обозначаемая значком ^ . Результаты применения этой операции показаны ниже:

5 ^ 2

ans =

25

или

t = ans ^ ( 0.5 )

t =

5

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

Помимо арифметических операций используются ещё операции отношения и логические операции.

Операции отношения сравнивают между собой два операнда по величине. Эти операции записываются следующими знаками или комбинациями знаков:

<

Меньше

<=

Меньше или равно

>

Больше

>=

Больше или равно

==

Равно

~=

Не равно

В случае истинности операции отношения её величина (то есть результат вычисления выражения) равна 1, а в случае ложности - 0. Вычисление выражений с операциями отношения показано на следующем рисунке:

Здесь выражение a < b вырабатывает единицу в силу того, что величина переменной a действительно меньше величины переменной b (истина).

Выражение c ~= b является истинным, так как на самом деле c, равное 3, не равно b, которое равно двум. В итоге оно вырабатывает значение 1.

Последнее выражение, b == a, не является истинным и вырабатывает 0.

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

Операции отношения имеют более низкий приоритет по отношению к арифметическим операциям, поэтому рассмотренная выше переменная res равна сумме значений трёх операций отношения только потому, что мы заключили эти операции в круглые скобки. Очень важно всегда помнить об этом, так как отсутствие круглых скобок может привести к изменению результата. Например, если a=1, b=1, c=3, то выражение

c + ( b == a )

равно 4, в то время как выражение без круглых скобок

c + b == a

равно 0.

Теперь обратим внимание на роль точки с запятой в системе MATLAB. Точка с запятой может использоваться для разных целей. Когда мы вводим с клавиатуры некоторое выражение (оно расположено после знака приглашения >>) и нажимаем клавишу ENTER, то MATLAB прозводит вычисление этого выражения и выводит результат в своё командное окно. Если мы не хотим тотчас же видеть результат вычислений (это характерно, например, для промежуточных результатов), то в конце введённого выражения следует поставить точку с запятой, и только после этого нажать ENTER.

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

Последней группой операций являются логические операции, перечисленные в следующей таблице:

&

И

|

ИЛИ

~

НЕ

Первые две из этих операций являются двухоперандными (бинарными), а операция "НЕ" является унарной. Знак ~ ставится перед операндом, а знаки & и | ставятся между операндами.

Логические операции трактуют свои операнды как "истинные" (не равные нулю) или "ложные" (равные нулю). Если оба операнда операции "И" истинны (не равны нулю), то результат этой операции равен 1 ("истина"); во всех остальных случаях операция "И" вырабатывает значение 0 (ложь). Операция "ИЛИ" вырабатывает 0 (ложь) только в случае, когда являются ложными (равными нулю) оба операнда. Наконец, операция "НЕ" инвертирует "ложь" на "истину" и наоборот. То есть, если её операндом является ненулевое число, то эта операция вырабатывает 0, а если операнд нулевой, то тогда результатом применения операции "НЕ" будет единица.

Логические операции имеют самый низший приоритет.

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

3. Рабочее пространство системы MATLAB и её командное окно. Когда Вы запускаете MATLAB и начинаете производить вычисления, в командном окне показываются вводимые с клавиатуры числа, переменные (через их имена), результаты вычислений. Обычно вычисления повторяются вновь и вновь: вводятся с клавиатуры новые числовые данные и новые символьные выражения. В результате в окне MATLABа не хватает свободного места и производится "скроллирование" ("протяжка"; "прокрутка") - все строки сдвигаются на одну позицию вверх, так что самая верхняя строка покидает область видимости, а в самом низу окна появляется свободная строка для ввода новых данных. Естественно, эта строка содержит знак приглашения >>.

Та информация, что покинула видимую часть окна, никуда не исчезает. Её всегда можно просмотреть снова, если осуществить прокрутку содержимого окна стандартным графическим средством управления - полосой прокрутки (по английски - Scrollbar). Для этого нужно щелкнуть мышью на этой полосе, или протащить с помощью мыши ползунок полосы прокрутки в нужном направлении (вверх или вниз).

Можно также осуществлять прокрутку содержимого командного окна системы MATLAB с помощью следующих клавиш клавиатуры: PageUp, PageDown, Ctrl+Home (одновременное нажатие клавиш Ctrl и Home) и Ctrl+End.

Клавиши "Стрелка вверх" и "Стрелка вниз", в любом текстовом редакторе осуществляющие перемещение курсора вверх-вниз и прокрутку содержимого окна, в системе MATLAB работают по-другому. Эти клавиши позволяют вернуть в строку ввода ранее введённые с клавиатуры команды и другую входную информацию, то есть вся эта информация запоминается в специальной области памяти. Эту область памяти называют стеком команд, так самая последняя входная информация при её прокрутке клавишой "Стрелка вверх" появится первой. Затем появится предпоследняя команда и так далее. Клавиша "Стрелка вниз" осуществляет прокрутку команд в противоположном направлении.

В

Полоса прокрутки

( Scrollbar )

Зона просмотра

Зона редактирования

итоге можно сказать, что вся видимая информация в окне системы MATLAB располагается в двух принципиально разных зонах: зоне просмотра и зоне редактирования.

В зоне просмотра уже ничего нельзя исправить, хотя в неё и можно поместить курсор, однако реакцией на ввод с клавиатуры будет автоматическое перемещение курсора (то есть точки ввода) в строку ввода, расположенную в зоне редактирования. В зоне просмотра можно выделять (селектировать) с помощью мыши любую информацию и копировать её в Буфер обмена операционной системы Windows (то есть в Clipboard), чтобы потом вставить её либо в документ текстового редактора (например, редактора Word), либо опять-таки в строку ввода.

Зона редактирования обычно занимает одну (последнюю) строку командного окна системы MATLAB, в которой показан знак приглащения >>. Её мы и называем строкой ввода. Однако при необходимости эту логическую "строку" можно распространить на несколько физических строк командного окна MATLABа. Для этого нельзя просто нажать клавишу ENTER, так как при этом ввод информации будет закончен и MATLAB приступит к вычислениям и дальнейшему показу результата. Поэтому для продления ввода с показом в водимой информации на следующих физических строках требуется нажать ENTER только п

Логическая строка ввода, состоящая из двух физических строк

Зона редактирования

осле трёх или более точек, что и показано на рисунке.

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

Все значения переменных, вычисленные в течение текущего сеанса работы системы MATLAB, сохраняются в специальной области памяти компьютера, называемой Рабочим пространством (английскийское название - Workspace). Можно стереть командой

clc

всё видимое содержимое окна системы MATLAB, однако это не затронет содержимого Рабочего пространства. Действительно, если после этого набрать имя ранее вычисленной переменной a, то после нажатия клавиши ENETR мы снова увидим её значение:

>>a

a =

20

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

clear имя1 имя2 …

удаляющей из Рабочего пространства переменные с именами имя1 и имя2. Чтобы удалить сразу все переменные, нужно использовать команду

clear

Если Вы не знаете или сомневаетесь, какие переменные остались в Рабочем пространстве, Вы всегда можете выполнить команду

who

к оторая выведет список всех переменных, входящих на данный момент в Рабочее пространтсво системы MATLAB (смотри следующий рисунок).

Д ля просмотра значения любой переменной из текущего Рабочего пространства достаточно набрать её имя и нажать клавишу ENTER.

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

File | Save Workspace As…

после чего появляется стандартное диалоговое окно операционной системы Windows для выбора каталога на диске и имени файла. Расширение имени файла должно быть mat. Такие файлы будем называть MAT-файлами.

Вместо команды меню можно набрать команду

save путь_к_файлу\имя_MAT-файла

непосредственно в командном окне MATLABа.

В новых сеансах системы MATLAB вы можете восстановить ранее сохранённое на диске Рабочее пространство командой меню

File | Load Workspace…

после которой Вы в стандартном диалоговом окне указываете нужный MAT-файл.

Более того, выполнив эту команду несколько раз с разными файлами, мы можем соединить в текущем Рабочем пространстве системы MATLAB содержимое нескольких предыдущих сеансов работы! Однако, если имена переменных из разных сеансов совпадают, то в текущем Рабочем пространстве будет представлена лишь переменная из последнего открытого MAT-файла.

Вместо команды меню можно набрать команду

load имя_MAT-файла

непосредственно в командном окне MATLABа. Можно также из записанного на диске MAT-файла считать в Рабочее пространство значения отдельных переменных. Для этого нужно выполнить команду

load имя_MAT-файла имя1, имя2, …

В результате из указанного MAT-файла будут считаны переменные с именами имя1, имя2 и т. д. При этом, если MAT-файл указан без полного пути к нему, то он должен находиться в текущем каталоге системы MATLAB, который всегда можно узнать с помощью команды

cd

Изменить текущий каталог можно командой

cd путь_к_новому_каталогу

4. Элементарные математические функции. В системе MATLAB присутствуют все основные элементарные функции: степенные, показательные, тригонометрические и обратные к ним. Любая функция характеризуется своим именем, списком входных аргументов (перечисляются через запятую и стоят внутри круглых скобок, следующих за именем функции) и вычисляемым (выходным) значением.

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

a=1; b=0;

xor( a, b )

ans =

1

а если оба аргумента "истинны " или оба "ложны", то эта функция вырабатывает нуль:

a=1; b=1;

xor( a, b )

ans =

0

Помимо операции возведения в степень, реализуемой с помощью знака ^, есть ещё функция извлечения квадратного корня sqrt, функция exp для возведения в степень числа e, функция pow2 для возведения в степень числа 2. Также присутствуют обратные к ним функции: log - натуральный логарифм, log10 - логарифм по сонованию 10, log2 - логарифм по сонованию 2. В системе MATLAB можно быстро получить справочную информацию по любой элементорной функции, выполнив команду

help имя_функции

Тригонометрические функции представлены весьма полно: sin, cos, tan (тангенс), cot (котангенс), asin (арктангенс), acos (арккосинус), atan (арктангенс), acot (арккотангенс). Имеются также и менее употребительные функции типа секанса, косеканса и т. д., а также гиперболические функции (являются комбинацией экспонент).

Для примера, вычислим выражение 2 * asin( 1 ),включающее вычисление функции asin, и получим следующий результат:

ans =

3.1416

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

Упомянем ещё функции, связанные с целочисленной арифметикой. Например, функции округления: round (округление до ближайшего целого), fix (усечение дробной части числа), floor (округление до меньшего целого), ceil (округление до большего целого).

Кроме того, есть ещё функции mod (остаток от деления с учётом знака), rem (остаток в смысле модульной арифметики), sign (знак числа), factor (разложение числа на простые множители), isprime (истинно, если число простое), primes (формирование списка простых чисел), rat (приближение числа в виде рациональной дроби), lcm (наименьшее общее кратное), gcd (наибольший общий делитель).

Функции mod и rem дают одинаковый результат для положительных аргументов. В частности,

mod( 7, 2 ) == rem( 7, 2 ) == 1

Но для операций с аргументами разных знаков они вырабатывают разные значения:

mod( -7, 2 ) = 1 ; rem( -7, 2 ) = -1

В общем случае эти функции связаны с функциями округления следующим образом:

rem( x, y ) == x - y * fix( x / y )

mod( x, y ) == x - y * floor( x / y )

И, наконец, есть функции, вычисляющие некоторые стандартные результаты из комбинаторики: функция perms вычисляет число перестановок, а функция nchoosek - число сочетаний. Например, число сочетаний из 10 по 3 легко находится вызовом функции:

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

Warning: Divide by zero.

при попытке деления на нуль. А в качестве результата выводится

ans =

Inf

где Inf символизирует бесконечность. Тот же результат получается при попытке вычислить логарифм от нуля.

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

5 . Комплексные вычисления в системе MATLAB. При вычислении функции sqrt( -1 ) порождается комплексное число:

Как мы видим из рисунка, мнимая единица в системе MATLAB обозначается традиционной для математической литературы буквой i. Помимо этого для мнимой единицы в MATLABе зарезервирована ещё и буква j. Лучще не использовать эти буквы для других целей во избежание собственной путаницы.

В случае переменных нельзя писать просто x + iy , а нужно обязательно использовать знак умножения, то есть x + i * y.

Почти все элементарные функции допускают вычисления с комплексными аргументами. Например:

res = sin( 2 + 3i ) * atan( 4i ) / ( 1 - 6i )

res=

-1.8009 - 1.9190i

Теперь мы можем проверить знаменитую формулу Эйлера:

exp( i*x ) = cos( x ) + i * sin( x )

Придавая вещественной переменной x различные значения, вычисляем выражения из правой и левой частей этой формулы. Например, при x = 1 имеем как для левого, так и для правого выражения одно и то же значение: 0.5403 + 0.8415i. Для x = 2 обе стороны этого равенства дают снова одинаковый результат -0.4161 + 0.9093i, и так далее.

Н о в очевидных случаях о комплексных аргументах не может быть и речи:

Специально для работы с комплексными числами предназначены следующие функции: abs (абсолютное значение комплексного числа), conj (комплексно сопряжённое число), imag (мнимая часть комплексного числа), real (действительная часть комплексного числа), angle (аргумент комплексного числа), isreal (истина, если число действительное).

Заметим, что никаких специальных соглашений об именах комплекснозначных переменных и комплексных функций не существует. Переменные не требуют никакого предварительного описания (объявления). Все вычисления перетекают из вещественной области в комплексную абсолютно автоматически. Это происходит при задании комплексных операндов (используются зарезервированные имена i или j для комплексной единицы) или при невозможности ограничиться лишь дествительными вычислениями (как в случае вычисления функции sqrt( -1 )).

Итак, система MATLAB может прозрачно для пользователя перейти от вычислений с действительными числами к вычислениям с комплексными числами. Кроме того, MATLAB может производить вычисления с набором вещественных (или комплексных) чисел почти так же, как и с одиночными числами. В этом состоит одна из самых характерных особенностей системы MATLAB.

6. Массивы чисел в системе MATLAB. Наборы чисел в программировании принято называть массивами. Всему массиву присваивается одно имя, а доступ к отдельным элементам массива осуществляется по целочисленному индексу, то есть номеру элемента в массиве. Массивы бывают одномерными, когда используется единственный индекс (номер), а могут быть и многомерными (в частности - двумерными).

Сначала рассмотрим одномерные массивы. Это линейные наборы чисел (элементов), в которых позиция каждого элемента задаётся единственным числом - его номером. Можно говорить о первом элементе массива, о втором и т. д.

Для задания одномерного массива, состоящего из нескольких чисел (вещественных или комплексных), используется операция конкатенации, обозначаемая с помощью квадратных скобок - []. Например, следующее выражение

a1 = [ 1 2 3 ]

формирует переменную с именем a1, являющуюся одномерным массивом из трёх элементов (вещественных чисел). Объединяемые в массив элементы должны отделяться друг от друга либо пробелом, либо запятой. Так что выражение

a1 = [ 1, 2, 3 ]

абсолютно идентично предыдущему.

Для доступа к индивидуальному элементу одномерного массива нужно после его имени указать в круглых скобках индекс (номер) этого элемента. Например, третий элемент массива a1 обозначается как a1(3), первый элемент - как a1(1), второй элемент - как a1(2).

Если требуется изменить третий элемент уже сформированного выше операцией конкатенации массива a1, то можно применить операцию присваивания:

a1(3) = 789

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

a1(2) = ( a1(1) + a1(3) ) / 2

Количество элементов в одномерном массиве всегда можно узнать с помощью функции length:

length( a1 )

ans =

3

П ри попытке чтения несуществующего элемента (напрмер, четвёртого элемента массива a1) в командном окне MATLABа появляется сообщение об ошибке:

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

В то же время запись несуществующего элемента вполне допустима - она означает добавление нового элемента к уже существующему массиву:

a1(4) = 7

Применяя к массиву a1 функцию length, находим, что количество элементов в этом массиве возросло до четырёх:

length( a1 )

ans =

4

То же самое действие - "удлинение массива a1" ,можно выполнить и с помощью операции конкатенации:

a1 = [ a1 7 ]

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

Теперь создадим ещё один одномерный массив a2, причём для его создания не будем использовать операцию конкатенации (как мы поступили выше). Вместо этого будем прописывать каждый элемент создаваемого массива по-отдельности:

a2(1) = 67

a2(2) = 7.8

a2(3) = 0.017

Из двух существующих массивов - массива a1 с четырьмя элементами и массива a2 с тремя элементами, можно одной (групповой) операцией конкатенации создать одномерный массив b из семи элементов:

b = [ a1, a2 ]

Массивы могут состоять не только из вещественных чисел. Выражение

d = [ 1+2i, 2+3i, 3-7i ]

формирует одномерный массив d комплексных чисел. Разделителем элементов формируемого одномерного массива может быть либо пробел, либо запятая. При использовании выражений и комплексных чисел использование запятой предпочтительнее.

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

Д вумерный массив характеризуется количеством строк и количеством столбцов. Составим массив a3, состоящий из двух столбцов и трёх строк:

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

Как и в случае одномерных массивов двумерный массив можно создать, индивидуально прописывая его элементы:

a3(1,1) = 1

a3(1,2) = 2

a3(2,1) = 3

a3(2,2) = 4

a3(3,1) = 5

a3(3,2) = 6

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

Система MATLAB может работать и с массивами больших размерностей. Они будут рассматриваться позже в следующем разделе.

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

В системе MATLAB все одномерные массивы трактуются либо как вектор-строки, либо как вектор-столбцы. До сих пор мы вводили только вектор-строки. Следующее выражение, использующее операцию конкатенации, задаёт вектор-столбец

a4=[ 1; 2; 3]

состоящий из трёх строк, так как точка с запятой в операции конкатенации означает переход на новую строку.

Для массива a4 функция length( a4 ) возвращает число 3, так как действительно этот массив состоит из трёх элементов. Функция length не различает вектор-строки и вектор-столбцы.

Если попросить систему MATLAB показать значение переменной a4, то мы увидим следующую картину:

a4 = 1

2

3

То есть MATLAB распознаёт "геометрию" этого одномерного массива и наглядно отображает его, располагая элементы для показа в своём окне вертикально.

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

size( a3 )

ans =

3 2

причём первым показывается число строк, а вторым - число столбцов.

Применяем эту же функцию к одномерным массивам. Вот, что из этого получается для вектор-строки a2

size( a2 )

ans =

1 3

состоящего из одной строки и трёх столбцов. Для вектор-столбца a4, состоящего из трёх строк и одного столбца, имеем следующий результат применения функции size:

size( a4 ) ans = 3 1

Наконец, попробуем применить эту функцию к переменной, состоящей из единственного числового значения, то есть к скаляру:

var1 = 5

size( var1 )

ans =

1 1

Отсюда видно, что система MATLAB трактует даже по-существу скалярные величины как массивы с размером 1x1. Это ровным счётом ничего не меняет для пользователя, так как он может не обращать на это никакого внимания. MATLAB переходит от скаляров к массивам прозрачно, не требуя от пользователя дополнительных действий.

Итак, всё, с чем работает MATLAB, является массивами различной размерности. Все массивы из текущего сеанса работы (текущего Рабочего пространства) можно просмотреть с точки зрения их структуры с помощью команды whos.

7. Синтаксис операций с массивами. Так как массивы являются важнейшим объектом нашего внимания в системе MATLAB, рассмотрим синтаксис операций с массивами более подробно.

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

Напомним также, что для операции конкатенации в качестве разделителей элементов используются либо запятые (пробелы), либо точки с запятой. Причём в первом случае речь идёт о "горизонтальной" конкатенации или конкатенации вдоль строк, а во втором - о "вертикальной" конкатенации или конкатенации вдоль столбцов. Например, операция

C = [ A1 , A2 ]

из двух матриц A1 и A2, у которых предполагается одинаковым число строк, производит более "широкую" матрицу C с числом столбцов, равным сумме столбцов матриц-слагаемых.

Операция же

C = [ A1 ; A2 ]

с оединяет матрицы A1 и A2 вертикально, производя матрицу C, у которой число строк будет равно сумме числа строк матриц A1 и A2. В случае разного числа столбцов у A1 и A2 появится сообщение об ошибке:

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

В связи с операцией индексации применяется единственный разделитель - запятая. Она отделяет друг от друга индексы, соответствующие разным направлениям группировки элементов массива (для двумерных массивов - вдоль строк и вдоль столбцов).

Существует ещё одна мощная групповая операция, применяемая к массивам. Это операция формирования диапазона значений, обозначаемая двоеточием. Составим одномерный массив diap1, состоящий из всех вещественных чисел от 3.7 (включительно) с приращением 0.3 и не более 8.947 . Для этого применяем операцию, обозначаемую двоеточием:

diap1 = 3.7 : 0.3 : 8.947 ;

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

Довольно трудно так сразу в уме подсчитать количество попадающих в заданный диапазон и, соответственно в массив diap1, элементов. Поэтому вызовем функцию length:

length( diap1 )

ans =

18

Чаще всего эту операцию применяют для формирования диапазона целых чисел:

diap2 = 4 : 2 : 26

Если приращение равно единице, то его можно для краткости опускать:

diap3 = 2:45

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

Применим операцию "диапазон" в контексте операции индексации:

a = [ 1 2 ; 3 4 ; 5 6 ];

b = a( 2 , : )

b =

3 4

Здесь операция "диапазон" позволяет захватить все имеющиеся значения второго индекса. В результате переменная b становится равной одномерному массиву, состоящему из всех элементов второй строки двумерного массива a. Таким образом, компактное выражение a( 2 , : ) позволяет "взять" из матрицы a её вторую строку.

Это же выражение позволяет удалить строку (или столбец), если при этом использовать понятие пустого массива, который обозначается как [ ]:

a( 2 , : ) = [ ]

Теперь рассмотрим другой пример. Пусть у нас имеется одномерный массив

a = [ 1 6 3 9 2 ];

Попробуем выделить из этого массива элементы со второго по четвёртый. Для этого запишем индексное выражение

b = a( 2 : 4 )

в котором указано не единственное значение индекса, а целый диапазон индексов, значения которых последовательно возрастают от 2 до 4. Это означает, что мы выполняем групповую операцию, помещающую в переменную b последовательно второй, третий и четвёртый элементы массива a. Таким образом формируется одномерный массив b:

b =

6 3 9

Из приведённого выше объяснения вытекает способ выбрать из массива a, например, три элемента в произвольном порядке, то есть сформировать одномерный массив b, первый элемент которого равен последнему элементу массива a, второй элемент b равен третьему элементу a, а третий элемент b равен первому элементу a. Вот решающее эту задачу выражение:

b = a( [ 5 3 1 ] )

так как в индексации участвует целый набор индексов, первый из которых равен 5, второй индекс (по порядку следования) равен 3, а третий равен 1. Это и объясняет порядок формирования элементов массива b.

Переставим местами столбцы в матрице

a = [ 1 2 3; 4 5 6; 7 8 9];

Мы хотим, чтобы последний столбец стал первым, второй - последним, а первый - вторым. Вот подходящее решение:

a = a( : , [ 3 1 2 ] )

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

Н апример, из матрицы a с размером 3x3, полученной предыдущей операцией и имеющей вид

можно сделать матрицу c с размером 4x5 :

c = a( [ 2 3 3 2 ] , [ 2 1 3 2 1 ] )

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

8. Взаимные преобразования векторов и матриц. Рассмотрим примеры, в которых из вектор-столбцов и вектор-строк получают матрицы и наоборот. Создадим вектор-столбец операцией конкатенации:

v = [ 1 ; 2 ]

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

v( 1 , 1 ) = 1;

v( 2 , 1 ) = 2;

так как если бы мы писали v( 1 ) = 1; v( 2 ) = 2, то мы создали бы вектор-строку.

Теперь с помощью выражения

v = v( : , [ 1 1 ] )

п ревращаем переменную v из вектор-столбца в матрицу 2x2:

Про только что выполненную операцию можно сказать, что для получения матрицы исходный вектор-столбец был продублирован (размножен два раза). А как быть, если нужно размножить столбец много раз? Не писать же операцию конкатенации на несколько километров! Или, если нужно продублировать вектор-столбец N раз, где N - переменная. В этом случае пригодится функция ones, порождающая массивы любой размерности, все элементы которых равны единице.

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

U = ones( 1,N )

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

v = v( : , ones( 1,N ) )

позволяет размножить вектор-столбец v ровно N раз, то есть получить матрицу 2xN.

Под конец приведём совсем уж замысловатые выражения. Пусть A - матрица 3x2:

A = [ 4 2 ; 1 6 ; 5 3 ],

и a=[ 1 7 2 4 5 1 ] - вектор-столбец. Мы знаем, что выражение A( 2,1 ) означает конкретный элемент матрицы A (стоящий во второй строке и первом столбце); выражение A ( :,2 ) означает второй столбец матрицы A (так второй индекс равен 2, а первый пробегает в порядке возрастания все возможные значения).

Ну, а что значит выражение A( : )? Оказывается, это не то же самое, что и A(:,:). Последнее есть та же матрица A, а A( : ) есть набор из всех элементов матрицы A, упорядоченный линейно по столбцам ( то есть, это вектор-столбец ): сначала идут все элементы первого столбца, затем - элементы второго столбца и так далее ( кстати, в памяти компьютера все массивы хранятся именно таким образом )

Теперь понятно, что справедливо равенство

a( A( : ) ) == [ 4 1 5 7 1 2 ]

Здесь элементы матрицы A, упорядоченные по столбцам, являются индексами для входа в массив a, откуда и извлекаются элементы для формирования массива-результата.

А что может значить такое выражение - a(A)? Спросим об этом у самой системы MATLAB:

Из рисунка видно, что мы из одномерного массива a получили матрицу 3x2. MATLAB трактует такое выражение как порождающее двумерный массив той же структуры, что и матрица A, поставляющая индексы для выборки значений из одномерного массива a.

Итак, для индексов можно использовать не только линейные диапазоны, но и структурированные геометрически наборы чисел!!!

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

Дадим наглядную иллюстрацию многомерных массивов на примере массива трёх измерений. Допустим, что ежедневно в течение месяца проводятся измерения одних и тех же величин, причём значения этих величин за день сводятся в прямоугольную таблицу. Тогда в конце месяца имеются тридцать двумерных таблиц. Как упорядочить всю эту совокупность опытных данных? Для этого можно расположить эти матрицы вдоль некоторого направления и пронумеровать их. Это будет уже третье направление упорядочивания данных, так как вдоль первого направления (условно - вертикального) упорядочиваются строки, вдоль второго (горизонтального ) - столбцы. В результате третий индекс для доступа к отдельному элементу данных будет равен номеру таблицы вдоль "направления времени". Получившаяся совокупность упорядоченных данных иллюстрируется следующим рисунком:

Е

2 3 1 . . . . 4

3 1 1 . . . . 8

. . . . . . . .

4 4 4 4 4 . . 9

3 4 3 . . . . 6

5 8 9 . . . . 7

. . . . . . . .

2 5 1 . . . . 6

7 7 6 . . . . 7

4 4 4 . . . . 5

. . . . . . . .

1 1 2 . . . . 8

Матрица измерений

за первый день

Матрица измерений за второй день

Матрица измерений за тридцатый день

сли создать трёхмерный массив A, содержащий так упорядоченные данные, то к индивидуальному данному можно обращаться с помощью трёх индексов. Элемент A(1,2,2) находится в первой строке, втором столбце и во второй матрице. Из рисунка видно, что этот элемент равен 3.

Теперь расскажем о том, какими операциями можно создать такой массив. Во-первых, это прямое прописывание всех его элементов:

A(1,1,1)=3; A(2,1,1)=5;… A(1,2,1)=4;A(2,2,1)=8;… A(1,1,2)=2;

A(2,1,2)=3;…A(1,2,2)=3;… A(1,1,,30)=7; A(2,1,30)=4;

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

A(:,:,1) = B1; A(:,:,2) = B2;…A(:,:,30) = B30;

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

И, наконец, целесообразно применить функцию ones в тех случаях, когда почти все элементы многомерного массива равны единице, после чего прописать индивидуальные значения для немногочисленных неединичных элементов.

Для примера, создадим таким образом трёхмерный массив D с размером 2x3x2:

D=ones(2,3,2);

а потом изменим значения двух элементов:

D(2,2,1)=7;D(1,2,2)=5;

П осле этого попросим MATLAB показать содержимое этого массива:

Мы ранее в связи с матрицами (массивами размерности два) уже рассказывали, как MATLAB хранит в памяти элементы массивов, а именно в виде одного большого столбца. Это же справедливо и для многомерных массивов. К примеру, для только что представленного на рисунке трёхмерного массива D сначала идут элементы первого столбца первой матрицы ("страницы"), затем - второго столбца первой матрицы, далее - элементы первого столбца второй матрицы, и, наконец, идут последними элементы второго столбца второй матрицы. Обратиться к элементам в такой последовательности можно, указав единственный индекс для трёхмерного массива D. Верны следующие равенства:

D(3)==1; … D(4)==7; … D(7)==1; … D(9)=5; …

Работа с массивами размерности 4 и выше вполне аналогична рассмотренной нами работе с массивами размерности 3.

10. Функции для работы с массивами. В системе MATLAB несколько функций специально предназначены для работы с массивами. Одну из таких функций - функцию ones, мы уже рассмотрели в предыдущем пункте. Эта функция предназначена для создания массивов произвольной размерности с единичными элементами.

Другими функциями этой группы являются функция zeros, производящая массив из нулей, и функция rand, генерирующая массив со случайными элементами, равномерно распределёнными на интервале от 0 до 1.

Например, выражение с этой функцией

A = rand( 3 )

производит массив 3x3 случайных чисел чисел

равномерно распределённых на интервале от 0 до 1.

Если вызвать эту функцию с двумя аргументами

B = rand( 2 , 3 )

То получится матрица B размером 2x3, элементами которой являются случайные числа. Эту функцию можно вызвать и с большим числом скалярных аргументов - в этом случае будут генерироваться многомерные массивы случайных чисел.

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

help имя_функции

Получив такую справку по функции rand, узнаём, что вызов функции rand(2,3) полностью эквивалентен вызову rand( [ 2 , 3 ] ), то есть вместо двух скалярных аргументов можно задать одну вектор-стоку с двумя элементами. Так как функция size для матрицы C = [ 1 2 ; 4 5 ; 7 8 ] возвращает вектор-строку v

v = size( C )

v =

3 2

элементами которой служат размеры матрицы C, то вызовы

D = rand( 3, 2 ); D = rand( [ 3 , 2 ] ) и D=rand( size( C ) )

эквивалентны. Вместо последнего выражения можно использовать последовательность следующих двух выражений:

[ m , n ] = size( C ); D = rand( m , n );

где мы ввели две скалярные переменные m и n для размеров матрицы C, определяемые за один вызов функции size.

Ранее при рассмотрении многомерных массивов мы уже сказали, что операцию конкатенации с помощью квадратных скобок нельзя применить для порождения нового измерения в матрицах (кроме как для перехода от размерности 1 к размерности 2). Для этой цели применяют специальную функцию cat. Пусть имеются два двумерных массива (матрицы) A1 = [ 1 2 3 ; 4 5 6 ] и A2 = [ 7 8 9 ; 3 2 1 ]. Тогда их конкатенация вдоль разных направлений приводит к следующим результатам:

1). cat( 1, A1,A2 ) порождает массив [1 2 3; 4 5 6 ; 7 8 9; 3 2 1 ]

то есть тот же результат, что и [ A1 ; A2 ].

2). cat( 2, A1,A2 ) порождает массив [ 1 2 3 7 8 9 ; 4 5 6 3 2 1 ]

то есть тот же результат, что и [ A1 , A2 ].

3 ). A3 = cat( 3, A1,A2 ) порождает из двумерных массивов A1 и A2 трёхмерный массив A3, который показывается в командном окне следующим образом:

Н

7 8 9

3 2 1

аглядно такой массив можно изобразить на "трёхмерном" рисунке:

Д

1 2 3

4 5 6

ля простых расчётов с элементами массивов предназначены функции sum, prod, max, min и sort. Функцию sum чаще всего применяют для одномерных массивов, где она суммирует все элементы. Для матриц (двумерных массивов) эта функция суммирует элементы в столбцах, так что если B = [ 1 2 3 ; 4 5 6 ; 7 8 9 ], то

sum( B ) == [ 12 , 15, 18 ]

Для многомерных массивов эта функция позволяет выбрать направление суммирования элементов.

Функция prod во всём аналогична только что рассмотренной функции sum, но только вместо суммирования выполняет умножение, так что

prod( B ) == [ 28 , 80, 162 ]

Функции max и min ищут, соответственно, максимальный и минимальный элементы в массивах, причём если для одномерных массивов это единственный экстремальный элемент, то для матриц функции порождают набор экстремальных элементов для каждого столбца. Таким образом,

max( B ) == [ 7 , 8, 9 ]

На примере этих функций покажем ещё одну уникальную особенность функций в системе MATLAB - возможность требовать от тех функций, которые это могут, разное число возвращаемых значений!!!

Пусть имеется вектор-сторока v=[ 5 2 6 8 3]; Вызывая функцию min для этого массива, находим наименьший из его элементов:

m = min( v );

равный двум. Но если нас также будет интересовать и номер (индекс) N наименьшего элемента, то мы можем осуществить вызов функции min следующим образом:

[ m , N ] = min( v );

откуда видно, что в векторе v наименьший элемент стоит на втором месте.

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

Под конец рассмотрим очень важные функции all, any и find. Функция all в случае её применения к вектору возвращает 1 ("истина"), если все элементы вектора не равны нулю ("истинны"), или 0 в противном случае (то есть в случае, если хотя бы один элемент нулевой). Функция any действует противоположным образом. Она возвращает нуль в случае, когла все элементы вектора нулевые, и она возвращает единицу, когда хотя бы один элемент ненулевой. В случае применения к матрицам обе эти функции трактуют столбцы матриц как векторы, по каждому из которых нужно дать результат так, как это описано выше.

Для примера, если F = [ 1 2 0 ; 0 3 0; 7 4 0 ], то

all( F ) == [ 0,1,0 ]; any( F ) == [1,1,0];

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

u = find( v )

возвращает вектор u индексов ненулевых элементов. В частности, для вектора

v=[1 0 3] имеет место равенство

find( v ) == [ 1 3 ]

так как отличны от нуля элементы с номерами (индексами) 1 и 3.

Для матриц функция find возвращает уже не один вектор индексов, а целый их набор. Каждый вектор из этого набора получается обработкой отдельного столбца матрицы. Например, для матрицы A = [ 1 0 3; 0 4 5; 6 7 8] следующий вызов функции

[ u1 , u2 ] = find( A )

возвращает вектор-столбцы u1 и u2, первый из которых содержит номера строк отличных от нуля элементов матрицы A, причём матрица просматривается по столбцам слева-направо (сначала - первый столбец, затем - второй и т. д.). Вектор столбец u2 содержит номера столбцов ненулевых элементов. То есть справедливы равенства

u1 == [ 1; 3; 2; 3; 1; 2; 3 ]; u2 ==[ 1; 1; 2; 2; 2; 3; 3; 3 ]

11. Вычисления с массивами. Так как массивы явяляются самыми распространёнными и самыми ценными типами данных в системе MATLAB, то важно подробно рассмотреть все нюансы вычислений с ними. Ранее (п. 2) мы рассмотрели действие арифметических, логических операций и операций сравнения в частном случае скаляров (массив размера 1x1). Теперь повторим это рассмотрение для случая массивов.

Начнём с арифметических операций. Операции сложения и вычитания осуществляются с массивами поэлементно и обозначаются теми же самыми традиционными значками. Если A = [ 1 1 1; 2 2 2; 3 3 3 ];

B = [ 0 0 0; 7 7 7; 1 2 3 ], то справедливо равенство

A + B == [ 1 1 1 ; 9 9 9 ; 4 5 6 ];

Складываемые (вычитаемые) матрицы должны иметь одинаковые размеры. Допускается исключение - если одно из слагаемых является скаляром. В этом случае производится генерация матрицы с таким же размером, как и у матричного слагаемого, причём все её элементы одинаковые и равны исходному скаляру. Например,

A + 5 == [ 6 6 6 ; 7 7 7 ; 8 8 8 ];

То есть до выполнения поэлементного матричного сложения из скаляра 5 получают безымянную матрицу [ 5 5 5; 5 5 5; 5 5 5 ], которую и складывают с A.

Теперь рассмотрим умножение и деление (а также возведение в степень). Здесь традиционные значки зарезервированы за действиями линейной алгебры: знак * означает перемножение матриц (а также вектор-строк и вектор-столбцов) по широко известному правилу "строка на столбец". Традиционный знак деления / (а также знак \) закреплён за "операцией нахождения решений систем линейных уравнений". Все эти операции линейной алгебры (включая операцию транспонирования) будут подробно рассмотрены в главе, специально посвящённой решению математических задач с помощью системы MATLAB.

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

A .* B == [ 0 0 0 ; 14 14 14 ; 3 6 9 ];

Соответственно, выражение ( A .^ 2 ) позволяет возвести в квадрат каждый элемент матрицы A. При поэлементном умножении на скаляр производится "расширение скаляра до матрицы", или по-другому можно сказать, что на скаляр умножается каждый элемент матрицы:

A .* 4 == [ 4 4 4 ; 8 8 8 ; 12 12 12 ];

Для поэлементного деления используются комбинации знаков

./ и .\

обозначающие "правое и левое" поэлементные деления. Выражение A ./ B приводит к матрице с элементами A(k,m)/B(k,m), а выражение A .\ B приводит к матрице с элементами B(k,m)/A(k,m). Обе матрицы должны иметь одинаковые размеры, в случае скаляра производится его расширение до размеров операнда-матрицы. Например,

6 ./ A == [ 6 6 6 ; 3 3 3 ; 2 2 2 ];

О перации отношения и логические операции используютв случае матриц те же самые значки и выполняют поэлементные действия. В случае скаляра производится его "расширение". Выполним сравнение матриц A и B, используя операцию "меньше или равно":

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

Операции сравнения для массивов часто комбинируются с вызовом функции find. Действительно, представим, что для массива v = [ 1 3 6 7 0 ] все элементы, большие единицы, нужно сделать равными 9. Эта задача решается с помощью следующего выражения:

v( find( v > 1 ) ) = 9;

П оясним работу этого выражения. Функция find возвращает набор (массив) номеров тех элементов вектора v, для которых записанное неравенство v > 1 действительно имеет место. Ясно, что это номера [ 2 3 4 ]. Затем эти номера поступают на вход операции индексации массива v, что и обеспечивает присвоение девятки второму, третьему и четвёртому элементам v:

Таким образом, все элементы, большие единице, стали равны девяти.

Работу логических операций продемонстрируем на только что полученном новом значении вектора v, применив к нему операцию "НЕ":

~v == [ 0 0 0 0 1 ]

Математические функции, рассмотренные нами ранее в п.4, допускают использование не только скалярных аргументов, но и аргументов-массивов. В результате с помощью крайне компактных записей удаётся произвести большой объём вычислений. Например, выражения

x = 0 : 0.01 : pi/2; y = sin( x );

позволяют осуществить вычисления функции sin сразу в 158 точках. В результате мы имеем массив аргументов x (всего 158 значений) и массив y значений функции (также 158 элементов). Этих двух массивов уже достаточно для построения подробного графика функции sin. В системе MATALB эти два массива можно подать на вход специальной функции, автоматически производящей построение графиков функций. Эта техника будет рассмотрена в следующей главе.

А сейчас приближённо решим уравнение sin(x) = 0.315. Для этого нам потребуется записать всего лишь одно выражение:

res = ( max( find( y < 0.315 ) ) - 1 ) * 0.01

В результате вычислений получается приближённый корень: res = 0.3200. Так как шаг вычислений был выбран равным 0.01, то мы можем надеяться, что корень найден с точностью не хуже 0.01. Для проверки точности найденного корня вычисляем asin(0.315):

asin( 0.315 )

ans = 0.3205

Наше предположение о точности найденного корня полностью подтверждается.