Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодичкаИПлб.doc
Скачиваний:
39
Добавлен:
08.05.2019
Размер:
6.96 Mб
Скачать

3. Двумерные массивы – матрицы

Сказанное ранее о векторах справедливо и для матриц. Матрицу можно рассматривать как вектор-столбец из векторов-строк и задавать в командной строке

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

a =

1 2 3

4 5 6

или как вектор-строку из векторов-столбцов

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

a =

1 2 3

4 5 6

или вводить "классическим" способом – строку за строкой, нажимая после элементов каждой строки на Enter

>> a=[1 2 3

4 5 6]

a =

1 2 3

4 5 6

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

>> c=a(1,2)^3-sqrt(a(2,1))

c =

6

Индекс может быть и вычисляемым (задаваться выражением)

>> m=2; n=m+1;

>> a(m-1,n)

ans =

3

Добавить к существующей матрице строку или столбец можно конкатенацией. Например

>> b=[7 8 9]

7 8 9

>> a=[a; b]

a =

1 2 3

4 5 6

7 8 9

Внимание: размер добавляемой строки (столбца) должен совпадать с соответствующими размерами матрицы. В противном случае будет зафиксирована ошибка. Например

>> a=[a; [1 2 3 4]]

??? Error using ==> vertcat

All rows in the bracketed expression must have the same number of columns.

Этим сообщением Matlab извещает, что ошибочно используется вертикальная конкатенация. Все строки в выражении, заключенном в скобки, должны иметь одинаковое число столбцов. По аналогии можно выполнять и конкатенацию матриц. Например, горизонтальная конкатенация матриц (по столбцам)

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

a1 =

1 2 3

4 5 6

>> a2=[11 12 13 14; 15 16 17 18]

a2 =

11 12 13 14

15 16 17 18

>> a=[a1 a2] % матрицы с одинаковым числом строк

a =

1 2 3 11 12 13 14

4 5 6 15 16 17 18

Вертикальная конкатенация матриц (по строкам)

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

b1 =

1 2 3

4 5 6

7 8 9

>> b2=[11 12 13; 14 15 16]

b2 =

11 12 13

14 15 16

>> b=[b1; b2] % матрицы с одинаковым числом столбцов

b =

1 2 3

4 5 6

7 8 9

11 12 13

14 15 16

Текущий размер матрицы – число строк и столбцов – можно определить с помощью функции size (размер)

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

a =

1 2

3 4

5 6

>> size(a)

ans =

3 2

В ответе первым указывается число строк, вторым – число столбцов матрицы. Результат работы функции size (как и любой другой функции) можно сохранить в переменных и в дальнейшем использовать. По правилам языка слева от оператора присваивания может стоять имя только одной переменной. Например, можно записать

>> s=size(a)

s =

3 2

Из эхо-печати результата видно, что переменная s будет вектором-строкой, первый элемент которой равен числу строк матрицы а, второй – числу ее столбцов. И если требуется использовать в вычислениях, например, число строк матрицы, то в тексте программы необходимо указать s(1) – первый элемент вектора. Применять переменные с индексом не всегда комфортно. Удобнее было бы иметь две скалярные переменные – отдельные число строк и число столбцов. Ситуацию можно разрешить несколькими способами. Можно поэлементно разнести массив по скалярам

>> numrow=s(1)

numrow =

3

>> numcol=s(2)

numcol =

2

А можно "обмануть" Matab – разместить результат в два скаляра, конкатенированных вектор

>> [numrow numcol]=size(a)

numrow =

3

numcol =

2

Формально правила языка не нарушены, слева от знака = указан один объект – вектор, но только задан он не именем переменной, как обычно. Красиво! И, конечно же, никакого обмана здесь нет! Такая конструкция выражения присваивания официально используется в Matlab при работе с функциями, возвращающими несколько значений (и даже больше двух, и даже разных типов). Пример является поучительным, поскольку прием конкатенации отдельных переменных и/или констант в вектор часто используется в Matlab в случаях, когда необходимо разместить несколько объектов, а разрешен только один.

Сделать матрицу любого размера пустой можно одной операцией присваивания

>> b=[];

>> size(b)

ans =

0 0

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