Поэлементные и групповые операции над массивами.

Прежде всего, отметим, что над массивами одинаковых размеров допускаются операции сложения и вычитания, обозначаемые стандартными знаками + и –. Если A и B – массивы произвольной размерности, но одинаковых размеров, то допустимы выражения

>> A=[4 1; 0 5]

A =

4 1

0 5

>> B=[2 2; 1 7]

B =

2 2

1 7

>> C=A+B

C =

6 3

1 12

>> D=A-B

D =

2 -1

-1 -2

где элементы массивов C и D равны сумме и разности элементов массивов A и B соответственно. Иными словами, операции сложения и вычитания выполняются поэлементно и порождают массивы тех же размеров, что и исходные операнды. Если используются операнды разных размеров выдается сообщение об ошибке:

A =

4 1

0 5

>> S=[1 2 3; 0 4 2]

S =

1 2 3

0 4 2

>> A+S

Error using +

Matrix dimensions must agree.

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

>> A+7

ans =

11 8

7 12

В таких случаях скаляр предварительно расширяется до массива того же размера, что и матричный операнд. Так например, в приведенном примере из скаляра 7 сначала генерируется матрица [7 7; 7 7], которая и складывается далее поэлементно с матрицей A.

Для поэлементного умножения и поэлементного деления массивов одинаковых размеров применяются операции, обозначаемые комбинациями двух символов – «.*» для умножения и «./» для деления (поясним, что кавычки, разумеется, не входят в состав обозначений для указанных операций). Использование комбинаций символов можно объяснить тем фактом, что символами «*» и «/» обозначены специальные операции линейной алгебры над матрицами и векторами.

Заметим, что помимо операции «./», называемой также операцией правого поэлементного деления, в системе MATLAB имеется также операция левого поэлементного деления, обозначаемая «.\». Поясним, что выражение типа A./B приводит к матрице с элементами A(k,m)/B(k,m), где k и m – соответствующие индексы элементов матрицы. Выражение A.\B приводит, в свою очередь, к матрице с элементами B(k,m)/A(k,m).

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

>> X=[8 5 3 6; -2 4 -7 1]

X =

8 5 3 6

-2 4 -7 1

>> Y=[2 4 -7 9; 1 3 2 8]

Y =

2 4 -7 9

1 3 2 8

>> X.^3

ans =

512 125 27 216

-8 64 -343 1

>> X.^Y

ans =

1.0e+07 *

0.0000 0.0001 0.0000 1.0078

-0.0000 0.0000 0.0000 0.0000

Следует обратить внимание на результат, полученный при выполнении операции X.^Y. Как видно, система MATLAB выделила общий множитель 1.0e+07 для всех элементов результирующей матрицы. Кроме того, полученная матрица включает достаточно много нулевых элементов. Это объясняется тем, что по умолчанию в MATLAB установлен формат представления чисел short, при котором после десятичной точки отображается только четыре десятичные цифры. Более точный результат может быть получен, если задать формат short e:

>> format short e

>> X.^Y

ans =

6.4000e+01 6.2500e+02 4.5725e-04 1.0078e+07

-2.0000e+00 6.4000e+01 4.9000e+01 1.0000e+00

Знак «*» (кавычки, как и прежде, не входят в обозначение операции) закреплен за операцией умножения матрицы на матрицу (или матрицы на вектор) в смысле линейной алгебры. Отметим, что данная операция выполнима, лишь при условии, что количество столбцов в левом операнде равно количеству строк в правом операнде:

>> A=[4 -1 1; 1 5 1; 10 2 42]

A =

4 -1 1

1 5 1

10 2 42

>> x=[1; 2; 3]

x =

>> y=A*x

y =

Отметим, что простейшая в таком смысле операция умножения вектора на число может выполняться с помощью обычного оператора умножения («*»), причем умножать вектора на число можно как справа, так и слева:

>> q=[6 7 8 9]

q =

6 7 8 9

>> q*4

ans =

24 28 32 36

>> 4*q

ans =

24 28 32 36

Умножение матрицы на число подобно умножению вектора на число.

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

>> u=[1 5 7];

>> v=[2; 4; 6];

>> u*v

ans =

>> v*u

ans =

2 10 14

4 20 28

6 30 42

Как и следовало ожидать операция произведения векторов не является перестановочной.

Выполним теперь транспонирование матрицы (т.е. перемену мест ее строк и столбцов):

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

A =

1 2 3

4 5 6

>> At=A'

At =

1 4

2 5

3 6

Приведем примеры умножения матрицы на матрицу:

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

>> B=[2 0 -3; 1 2 7];

>> A*B'

ans =

-7 26

-10 56

>> A'*B

ans =

6 8 25

9 10 29

12 12 33

Для того, чтобы операции умножения матриц имели смысл, в первом случае потребовалось транспонировать матрицу B, а во втором – матрицу A.

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

>> C=[5 1 4; 1 7 7; 2 9 6]

C =

5 1 4

1 7 7

2 9 6

>> C^3

ans =

320 829 778

433 1672 1465

488 1827 1599

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

>> C^-3

ans =

1.8900e-03 -5.9837e-02 5.3903e-02

-1.4081e-02 -8.2427e-02 8.2371e-02

1.5512e-02 1.1244e-01 -1.0994e-01

Деление вектора на число происходит с помощью обычного оператора деления («/»), однако деление числа на вектор невозможно:

>> q/4

ans =

1.5000 1.7500 2.0000 2.2500

>> 4/q

Error using /

Matrix dimensions must agree.