8.5. Деякі алгоритми для кавдратних матриць
1. Обробка диагональних елементів. Знайти суму елементів на головній діагоналі. Ознакою того, що елементи знаходяться на головній діагоналі, є умова i=j, отже не потрібно вводити окремі цикли по кожній з індексних змінних

|Matr1


1 n
1 А є R
m

i,n, є N
S
є R

введення n,А
S:=0;

(i=1,n)
S:=S+ A[i,i]
Виведення: S
|end
2. Знайти суму елементів на побічній діагоналі
О
знакою
того, що елементи aij
знаходяться на побічній діагоналі, є
наступна залежність між індексами:
i+j=n+1
тоді
j=n-i+1 або i=n-j+1
Отже, для обчислення шуканої суми нам також достатньо одного циклу по будь-якому з індексів.

|Matr1


1 n
a
є R
m
i,n, є N
S
є R

введення n,a -1
S:=0;



(i=1,n) (j=n,1)
S:=S+
A[i,n-i+1] S:=S+
A[n-j+1,j];

виведення S
|end
3. Транспонування матриці.
При транспонуванні матриці достатньо обійти елементи матриці над головною диагональю і замінити їх місцями з відповідними елементами під головною діагоналлю
A[i,j] A[j,i],
ij.
Причому для індексів елементів над головною диагоналлю повинно виконуватись наступне співвідношення : j>=i+1.
Елементи на диагоналі не змінюються.
|Matr1
1 n



1 A є R
m
i,n,j є N

B
є R
введення n,B

(i=1,n-1)

(j=i+1,n)
B:=A[i,j]
A[i,j]:=A[j,i]
A[j,i]:=B

Виведення: A
|end
4. Обхід матриці по спиралі
(може бути реалізований не тількі для квадратних матриць, але в цьому випадку алгоритм виглядає трохи складніше)


1 n





n
а) симетричний алгоритм обходу матриці
Виділимо всередені матриці вкладені кільця і будемо їх послідовно обходити, від зовнішнього кільця до внутрішнього, способом, що його показано на малюнку.
j=p j=n-p+1





i=p
Кільце
з нумером p

i=n-p+1
Пронумеруємо кільця від зовнішнього кільця до внутрішнього. На малюнку показані зміни індексів при пересуванні по рядку та стовбцю для довільного p - го кільця. Загальне число кілець дорівнює n div 2.
Причому для матриць з n-парною, кількість елементів у самому внутрішньому кільці дорівнює 4, а для n-непарної - одному.

|sym


1 n
a
є R
m
i,n,j,p є N
B є R

введення n,A

(p=1,[n/2])

(j=p,n-p)
виведення A[p,j]

(i=p,n-p)
виведення A[i,n-p+1]
-1

(j=n-p+1,p+1)
виведення A[n-p+1,j]
-1

(i=n-p+1,p+1)
виведення A[i,p]


(n mod 20)

виведення
A[(n+1)/2,(n+1)/2]
|end
б) Несиметричний обхід
Порядок обходу і діапазони зміни індексів у випадку несиметричного обходу показані на малюнку.
j=p j=n-p+1




i=p



i=n-p+1
Алгоритм має наступний вигляд:

|sym


A
є R
i,n,j,p є N
B
є R

введення n,A

(p=1,(n+1)
div 2)

(j=p,n-p+1)
виведення A[p,j]

(i=p+1,n-p+1)
виведення A[i,n-p+1]
-1

(j=n-p,p)
виведення A[n-p+1,j]
-1

(i=n-p,p+1)
виведення A[i,p]
|end
Перевага алгоритму - не потрібна додаткова перевірка на парність або непарність розмірності матриці.
