Материал: Matlab. Практический подход. Самоучитель

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 4. Элементы матричной алгебры

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

>> A=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15;16 17 18 19 20]

A =

2

3

4

5

1

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

>> B=A(2:4,1:3)

B =

6 7 8

11 12 13

16 17 18

Сначала создается матрица A размерами 4×5, а затем командой B=A(2:4,1:3) из нее извлекается блок (подматрица, которая записывается в переменную B). Блок выделяется из исходной матрицы так: строки со 2-й по 4-ю включительно и столбцы с 1-го по 3-й включительно (рис. 4.18).

Рис. 4.18. Создание блочной матрицы

Еще одна полезная процедура, которую нередко приходится выполнять, – удаление из матрицы строки или столбца. Формально она состоит в том, что соответствующей строке или столбцу в качестве значения присваивается пустой список. Примеры приведены в документе на рис. 4.19.

171

Самоучитель Matlab

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

Сначала создается матрица A, а затем командой A(:,3)=[] из матрицы A удаляется 3-й столбец. Следующей командой A(:,3:4)=[] из измененной на предыдущем этапе матрицы A удаляются 3-й и 4-й. Матрица A становится еще меньше. После этого командой A(3,:)=[] из матрицы удаляем 3-ю строку. Весь командный код имеет следующий вид (жирным шрифтом выделен ввод пользователя):

>> A=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15;16 17 18 19 20]

A =

2

3

4

5

1

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

172

Глава 4. Элементы матричной алгебры

>> A(:,3)=[]

 

 

A =

2

4

5

1

6

7

9

10

11

12

14

15

16

17

19

20

>> A(:,3:4)=[] A =

12

6

7

11

12

1617

>>A(3,:)=[]

A =

12

67

1617

На заметку

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

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

На заметку

В данном случае не важно, что элементы именно нулевые. Важно то, что все они одинаковые.

Например, если мы имеем дело с квадратной диагональной матрицей размера n ×n , то на диагонали будет n элементов, а всего элементов n2 . То есть доля "полезных" элементов в матрице составляет n n2 = 1 n . При

n = 100 с пользой для дела будет использоваться только 1% от объема памяти, выделенной под матрицу. Такая расточительность может стать кри-

173

Самоучитель Matlab

тичной – кто сталкивался с серьезным математическим моделированием, знает, о чем идет речь.

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

Поскольку разница между разреженной и обычной матрицей достаточно зыбкая, принимать решение о том, какую матрицу считать разреженной, должен пользователь. Другими словами, разреженной матрица сама по себе не станет, даже если состоит сплошь из нулей. Разреженную матрицу нужно специально создавать. Для создания разреженной матрицы на основе уже существующей используют встроенную функцию sparse(). Аргументом можно указать обычную (не разреженную) матрицу (но можно и что-то другое). Простой пример создания разреженной матрицы приведен в документе на рис. 4.20.

Следующими командами создается прототип разреженной матрицы:

>>A=eye(5);

>>for i=1:4 A(i,i+1)=2; A(i+1,i)=3;

end

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

>> B=sparse(A)

B =

(1,1) 1

(2,1) 3

(1,2) 2

(2,2) 1

(3,2) 3

(2,3) 2

(3,3) 1

(4,3) 3

(3,4) 2

(4,4) 1

(5,4) 3

(4,5) 2

(5,5) 1

174

Глава 4. Элементы матричной алгебры

Рис. 4.20. Создание разреженной матрицы

Это при том, что матрица A отображается совершенно обычным образом:

>> A

A =

1

2

0

0

0

3

1

2

0

0

0

3

1

2

0

0

0

3

1

2

0

0

0

3

1

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

175

Источник: https://studfile.net/preview/16433384/